草庐IT

c++ - 用非虚函数覆盖虚函数

我有头文件“testcode.h”#ifndefTESTCODE_H#defineTESTCODE_HclassA{public:A();~A();virtualvoidFoo();public:intmPublic;protected:intmProtected;private:intmPrivate;};classB:publicA{public:B();~B();voidFoo();};#endif//TESTCODE_H和一个源文件#include"TestCode.h"intmain(intargc,char*argv[]){A*b=newB();b->Foo();b->mP

c++ - 如何通过多重继承实现多态行为?

我从未使用过多重继承,但在最近阅读它时,我开始思考如何在我的代码中实际使用它。当我正常使用多态性时,我通常通过创建声明为基类指针的新派生实例来使用它,例如BaseClass*pObject=newDerivedClass();这样我在派生类上调用虚函数时就能得到正确的多态行为。通过这种方式,我可以拥有不同多态类型的集合,这些类型通过它们的虚函数来管理自己的行为。在考虑使用多重继承时,我在考虑相同的方法,但如果我有以下层次结构,我会怎么做classA{virtualvoidfoo()=0;};classB:publicA{virtualvoidfoo(){//implementation

C++ 非多态接口(interface)

简单地说,您如何在C++中为单级继承创建接口(interface)(出于简单性和教学原因)?我看到一些代码没有使用多态性,但是基类包含一个虚拟抽象方法(virtualvoidTheMethod()=0)。现在用纯虚方法从这个抽象类派生出一个类,但是在后面的代码中,使用派生类的实例完全没有动态分配。这是正确的做法吗?使用多态设计推断出的开销又如何呢?我认为这是不可能的。这看起来更像是隐藏/重影基本方法,即使该方法是纯虚拟方法也是如此。稍后编辑:感谢所有设法提供一些好的答案的人,我想强调一个严重的错误,该错误是由于使用“动态分配”而引起的,其含义是强调这一点对象创建的可能性是唯一与多态性兼

c++ - 对虚重载函数感到困惑

这个问题在这里已经有了答案:Functionwithsamenamebutdifferentsignatureinderivedclass(2个答案)关闭7年前。我对以下代码的编译器错误感到困惑:classBase{public:virtual~Base(){}virtualvoidfunc(){}virtualvoidfunc(int){}virtualvoidanother(){}virtualvoidanother(int){}};classDerived:publicBase{public:voidfunc(){}};intmain(){Derivedd;d.func();d.

c++ - 本地抽象类的纯虚拟析构函数

考虑以下代码:structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};intmain(){A*a=newB();a->foo();}它工作得很好。但现在考虑第二个代码,我们需要在一个函数内本地声明我们的类:voidfoo(){structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};//errorC2352:'A::~A':illegalcallo

c++ - 函数声明中缺少 'virtual' 限定符

在浏览一些旧代码时,我遇到了类似于以下内容的内容:classBase{public:virtualintFunc();...};classDerived:publicBase{public:intFunc();//Missing'virtual'qualifier...};代码编译良好(MSVS2008),没有警告(级别4)并且按预期工作-Func是虚拟的,即使派生类中缺少虚拟限定符。现在,除了引起一些困惑之外,这段代码是否有任何危险,或者我是否应该全部更改它,添加virtual限定符? 最佳答案 virtual将被传递到派生类中的

C++虚函数执行效率

我正在尝试更好地了解虚函数的性能这是一个示例代码:structFoo{virtualvoidfunction1();virtualvoidfunction2(){function1();}};structBar:Foo{virtualvoidfunction1();}Barb;Foo&f=b;b.function2();b.function1();f.function2();对于代码示例最后三行中的三个调用中的每一个,它们是否都必须在虚拟表中查找函数指针?必须为f对象执行多少次查找。哪一次可以被编译器内联?谢谢 最佳答案 对b的调用

c++ - 如何避免 c++ 中多态对象的 clone() 样板代码

如果我想在C++中克隆一个多态对象(即从其他类B派生的类A的实例),最简单的方法似乎是给B一个虚拟克隆成员函数,它必须被覆盖A看起来像这样A*clone(){returnnewA(*this);}我的问题是,我发现这种不必要的样板代码,因为如果想使用C++的运行时多态特性,这几乎总是需要的。如何规避?谢谢为什么我需要这个:我的用例可以抽象为以下示例:我有一个classIntegral,它计算某个函数的积分。这样做,他们有一个成员,它是指向classMathFunction的指针。这个抽象类包含一个纯虚函数evaluate,它接受一个参数。我想实现幂函数,我将创建一个classPowFu

c++ - 为什么 virtual 关键字会增加派生类的大小?

我有两个类-一个基类和一个派生类:classbase{inti;public:virtual~base(){}};classderived:virtualpublicbase{intj;};main(){cout这里的答案是16。但是如果我改为非虚拟公共(public)继承或使基类成为非多态的,那么我得到的答案是12,即如果我这样做:classbase{inti;public:virtual~base(){}};classderived:publicbase{intj;};main(){cout或classbase{inti;public:~base(){}};classderived

c++ - 这是正确的 : virtual method of Derived called before constructing Base object?

我知道在Base类的构造函数中-当调用虚拟方法时-调用Base方法,而不是派生-参见Callingvirtualfunctionsinsideconstructors.我的问题与这个主题有关。我只是想知道如果我在Derived类构造函数中调用虚拟方法会发生什么-但在构造Base部分之前。我的意思是调用虚方法来评估基类构造函数参数,请参见代码:classBase{public:Base(constchar*name):name(name){cout编译器g++(4.3.x-4.5x版本)输出为:Derived::getName()Base():DerivedDerived():Deriv