我最近一直在阅读大量书籍,在涉及继承(和虚函数)的同时,我不断地遇到“内联”关键字。现在我知道内联在正常意义上是什么了——编译器可能会用确切的代码替换函数调用。然而,我看到它提到的关于继承的次数——在继承中使用内联是否有一些特殊的原因?我不明白为什么一直提到它....内联函数在继承/派生类/虚函数中有什么额外的作用? 最佳答案 是的,在虚函数上使用内联是浪费时间。必须通过由函数指针组成的虚函数表来调用虚函数。指针不能调用内联函数。它必须作为一个真正的函数存在。有一些异常(exception)。如果调用者知道确切的对象类型,它可以完全
我有一个关于protected函数的多重继承和多态性的问题。很难描述它,所以我希望它足够清楚。假设我有三个类:classbaseClass{protected:virtualintfunction()=0;};classderived_A:publicbaseClass{intfunction(){//implementation1};};classderived_B:publicbaseClass{intfunction(){//implementation2};};classderived_C:publicderived_A,publicderived_B{baseClass**p
Derived类中的方法fun()是私有(private)的。当我们通过运行时多态调用函数ptr->fun()时,它正在执行。但这违反了派生类的封装属性。#includeusingnamespacestd;classDerived;classBase{private:virtualvoidfun(){coutfun();return0;}谁能解释一下发生了什么? 最佳答案 首先,你的Derived::fun()也是virtual,因为如果派生类中的函数与派生类中的虚函数具有相同的声明基类,派生类中的函数自动获得virtual,即使没
我正在设计一个简单的Array类,该类具有保存任何类型对象的能力,例如可以在一个对象中保存多种类型数据的vector。(这是为了学习目的。)我有一个名为Container的空基类:classContainer{};还有一个名为Object的模板化子类:templateclassObject:publicContainer{T&object;public:Object(T&obj=nullptr):object(obj){}};我有一个Array类,它包含一个vector指针,指向Container我用来保存Object小号:classArray{std::vectorvec;publi
classA{virtualA*foo()=0;};templateclassB:publicA{virtualT*foo(){returnnullptr;}};classC:publicB{};这是Possibilitytomixcompositepatternandcuriouslyrecurringtemplatepattern的简化实现.我收到以下错误:Returntypeofvirtualfunction'foo'isnotcovariantwiththereturntypeofthefunctionitoverrides('C*'isnotderivedfrom'A*')在
classCar{classBaseState{explicitBaseState(Car*vehicle):mVehicle(vehicle){}virtualvoidrun()=0;Car*mVehicle;}classState1:publicBaseState{explicitState1(Car*vehicle):BaseState(vehicle){}virtualvoidrun(){//usedataofCar...doSomething();}virtualvoiddoSomething(){}}classState2:publicBaseState{}...}clas
我在自己的异常层次结构中遇到继承问题。Exception类具有很好的功能(回溯、日志记录等),因此它是我处理任何异常的基类。正如我在许多网页中看到的那样,它继承自std::exception。此外,我正在使用一个单元测试框架来报告任何std::exception被意外抛出。但归根结底,这只是为了方便。然后,我有一个新的OutOfMemoryException类,它将由自定义new_handler抛出。该类继承自Exception,但也继承自std::bad_alloc以兼容现有代码。我猜这更重要,因为new将不再抛出std::bad_alloc。这里的问题很明显:因为std::bad_
我想看看是否可以创建“接口(interface)”,继承它们,然后在运行时检查是否有任何随机类实现了该接口(interface)。这是我的:structGameObject{intx,y;std::stringname;virtualvoidblah(){};};structAirholder{intoxygen;intnitrogen;};structTurf:publicGameObject,publicAirholder{Turf():GameObject(){name="Turf";}voidblah(){};};voidremove_air(GameObject*o){Air
大编辑因此,在收集了大家的一些反馈并思考了XYproblem之后正如Zack所建议的,我决定添加另一个代码示例来准确说明我要完成的任务(即“X”),而不是询问我的“Y”。现在我们正在处理汽车,我添加了5个抽象类:ICar、ICarFeatures、ICarParts、ICarMaker,ICarFixer。所有这些接口(interface)都将包装或使用第三方库提供的技术特定的复杂对象,具体取决于接口(interface)背后的派生类。这些接口(interface)将智能地管理复杂库对象的生命周期。我的用例是FordCar类。在此示例中,我使用Ford库访问类FordFeatureIm
我想知道是否存在解决此问题的优雅解决方案。假设如下:classBase{private:intdata;protected:Base(intdata):data(data){}intgetData()const{returndata;}virtualboolsomeOp()=0;}classDerived1:publicBase{private:intdata2;public:Derived1(intdata,intdata2):Base(data),data2(data2){}intgetData2()const{returndata2;}boolsomeOp()override{/