草庐IT

virtual-destructor

全部标签

c++ - 有没有办法在 C++ 基类中创建 "virtual"变量?

我有一个带有指针的基类,需要在所有子类的构造函数中专门对其进行初始化。我怎样才能确保这个变量在子类的构造函数中被初始化?我基本上想要与制作纯虚函数相同的功能,除了指向对象的指针。有办法吗?我的代码看起来像这样:A.hpp:classA{protected:A();X*pointer;};B.hpp:classB:publicA{public:B();};B.cpp:B::B():A(){//howdoimakesurepointergetsinitializedhere?}有什么办法可以实现吗? 最佳答案 改rebase类的构造函数

C++:莫名其妙的 "pure virtual function call"错误

我在使用MicrosoftVisualC++2015时遇到了一些困难,但能够用一个小程序重现该问题。给定以下类:classBaseClass{public:BaseClass():mValue(0),mDirty(true){}virtual~BaseClass(){}virtualintgetValue()const{if(mDirty)updateValue();returnmValue;}protected:virtualvoidupdateValue()const=0;mutableboolmDirty;mutableintmValue;};classDerivedClass:

c++ - "The Rule of Zero"是否也适用于具有虚方法的类?

我找到了TheruleofZero正如在PeterSommerladsSlides中也提到的那样(第32页)非常引人注目。虽然,我似乎记得有一个严格的规则,必须定义析构函数virtual,如果类有虚拟成员并且实际上是派生的。structBase{virtualvoiddrawYourself();virtual~Base(){}};structDerived:publicBase{virtualvoiddrawYourself();};析构函数的主体甚至可以是空的(它只需要vtbl中的条目)。我好像记得用hierarchy的时候intmain(){Base*obj=newDerived

c++ - 虚函数可以内联吗

这个问题在这里已经有了答案:Areinlinevirtualfunctionsreallyanon-sense?(13个答案)inlinevirtualfunction(3个答案)关闭9年前。如果我这样定义一个类:classA{public:A(){}virtual~A(){}virtualvoidfunc(){}};是不是说虚析构函数和func是内联的

c++ - 有没有办法不继承子类中函数的 "virtualness"?

在C++中是否可以让一个类覆盖一个虚函数,但只有在通过父类(superclass)调用该函数时才具有虚拟分派(dispatch)(即,当它被静态类型为子类的东西调用时不存在)?我知道这不会发生,但有什么方法可以接近吗?想要这样做的原因是我有两个类都公开了一个flush()函数。在我的程序中的绝大多数时间,我直接在我知道类型的子类对象上调用flush(),因此我不需要虚拟分派(dispatch)。但是我想在混合中添加一个父类(superclass),这样我就可以很少将对任一类的实例的引用传递给doSomethingThenFlush()函数,该函数将调用flush()实际上。我知道我可以

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?

这个问题在这里已经有了答案:What'sthepointofafinalvirtualfunction?(11个答案)关闭5年前。在variousexplanationsC++11的final关键字,我看到了这样的例子。classbase{public:virtualvoidf()final;};classderived:publicbase{public:virtualvoidf();//Illegalduetobase::f()declaredfinal.};这实际上是final的有用用法吗?为什么要在基类中声明一个虚函数(暗示它可以在派生类中有用地重写)然后立即将其标记为fina

c++ - 为什么我们不能在 COM 中使用 "virtual inheritance"?

我读过一些模糊的声明virtualinheritance没有提供COM需要的内存结构,所以我们只好使用普通的继承。发明虚拟继承是为了解决菱形继承(钻石问题)。有人可以向我展示这两种继承方法之间内存结构细节差异的图示吗?以及虚拟继承不适合COM的关键原因。最好有照片。非常感谢。 最佳答案 首先,在COM中总是使用虚拟继承的行为。QueryInterface无法返回不同的值,例如IUnknown基指针取决于用于获取它的派生类。但是您是对的,这与C++中的虚拟继承机制不同。C++不使用QueryInterface函数进行向上转换,因此它需

c++ - clang 和 gcc 在使用智能指针时不会警告多态性的非虚基析构函数?

我们知道如果有虚函数那么基类析构函数也应该被标记为虚函数,否则当使用基类指针显式删除时它是未定义的行为如果我们希望删除带有基类指针的派生对象,基类析构函数应该被标记为虚拟的,否则就是未定义的行为。例如,structBase{virtualvoidgreet(){std::cout打电话Base*b=newDerived;b->greet();delete(b);当-Wdelete-non-virtual-dtor时,clang(gccsimilarly)会发出这样的警告:deletecalledon'Base'thathasvirtualfunctionsbutnon-virtuald

C++ 错误 : object of abstract class type is not allowed: pure virtual function has no overrider

继承有问题。我不知道我做错了什么。FigureGeometry.h#ifndefFIGUREGEOMETRY#defineFIGUREGEOMETRYstaticconstfloatPI=3.14159f;classFigureGeometry{public:virtualfloatgetArea()const=0;virtualfloatgetPerimeter()const=0;};#endifCircle.h#ifndefCIRCLE#defineCIRCLE#include"FigureGeometry.h"classCircle:publicFigureGeometry{fl

c++ - 没有虚拟析构函数可能会发生内存泄漏?

#includeusingnamespacestd;classbase{inta;public:base(){a=0;}};classderv:publicbase{intb;public:derv(){b=1;}};intmain(){base*pb=newderv();deletepb;}我在derv类中没有虚拟析构函数,它是否只删除derv对象的基部分?? 最佳答案 可能。因为base没有虚拟析构函数,所以您的代码表现出未定义的行为。任何事情都可能发生。它可能看起来像您预期的那样工作。它可能会泄漏内存。它可能会导致您的程序崩溃