21得票3回答
使用虚析构函数,我是否需要为每个子类显式声明一个虚析构函数?

我有一个场景,我正在编写一些深层次的面向对象的代码,其中包含多个抽象基类层,我想知道我是否必须为每个基类显式声明析构函数。 编译器会生成默认的虚拟析构函数吗?还是我需要告诉它?

20得票10回答
有自动化的方法来实现后构造函数和前析构函数虚拟方法调用吗?

由于在构造函数和析构函数内部调用虚拟方法的已知问题,我经常需要创建类,这些类需要在构造函数后立即调用最终设置方法,并需要在析构函数前调用预清除方法,就像这样:MyObject * obj = new MyObject; obj->Initialize(); // virtual me...

19得票2回答
为什么unique-ptr不检查基类是否为虚析构函数?

考虑这个例子: #include <cstdio> #include <memory> struct base { base( int i ): i(i) { printf("base ctor\n"); } ~base() { ...

17得票1回答
这个错误信息是关于隐式删除的虚析构函数的吗?

我刚刚将GCC从(我想是)4.5.6升级到了4.6.1,在Windows下使用MinGW。突然间,我的NonInstantiable基类(从中继承并使用public virtual来防止实例化)无法正常工作,并显示以下类似的错误消息:#ifndef Frigo_Lang_NonInstanti...

16得票4回答
强制使用虚析构函数?C++

在C++ Faq lite中我没有看到关于这个问题的答案: 如何定义一个基类,使得每个继承它的类都必须定义一个析构函数? 我尝试运行了这个程序struct VDtor { virtual ~VDtor()=0; }; struct Test:VDtor { virtual ~Test()...

16得票4回答
为什么纯虚析构函数需要有实现

我知道需要使用纯虚析构函数的情况。我也知道如果我们不为它们提供实现,将会得到链接错误。但我不理解为什么在下面所示代码片段中会出现这种情况:int main() { Base * p = new Derived; } 在这里没有删除,因此不需要调用析构函数,也没有必要实现它(假设它应该像...

16得票4回答
虚析构函数和未定义行为

这个问题与'何时/为什么应该使用虚拟析构函数?'不同。struct B { virtual void foo (); ~B() {} // <--- not virtual }; struct D : B { virtual void foo (); ~D() {} }...

15得票3回答
虚析构函数中传递的额外参数是什么?

我有这段代码:class Class { public: virtual ~Class() {} }; int main() { Class* object = new Class(); delete object; } 我使用Visual C++ 10编译,并得到以...

15得票1回答
“零规则”也适用于具有虚拟方法的类吗?

我发现零规则,正如Peter Sommerlad的幻灯片(第32页)中所提到的一样,非常有说服力。 尽管如此,我似乎记得有一个严格的规则,即如果类具有虚成员并且实际上是派生类,则必须定义析构函数为虚函数。 struct Base { virtual void drawYoursel...

14得票4回答
C++中非虚析构函数异常问题

当我们走出catch块的作用域时,异常析构函数会被调用吗? (假设我们没有重新抛出它) 假设我有一个类A,它的析构函数不是虚拟的。 B继承A。 假设某个函数抛出了B类对象作为异常, 并且它被catch块捕获。catch(A& a){ ... } 如果异常析构函数应该在离开catch作...