C ++虚拟析构函数

时间:2011-04-26 04:35:36

标签: c++ virtual-destructor

如果我有一个基类和一个派生类,并且我在父虚拟中删除了析构函数,但实例化了一个类型为subclass的对象,当它被销毁时它会调用父析构函数(从虚拟开始)?如果我还在派生类中声明了析构函数,它是否会调用析构函数(base和derived)。提前致谢: - )。

我的问题的第二部分是关于第一部分。为什么需要将基类析构函数声明为虚拟。建设者不要循环起来。它们没有相同的名称,所以需要它的位置?对于破坏者来说它不应该是一样的,或者默认只有一个叫做破坏者?也可以通过后期绑定来检测所有类和对象是由?

组成的

编辑:我的问题不仅仅是关于虚拟析构函数,而是为什么需要将其声明为虚拟,因为默认情况下它们都应该被调用。

3 个答案:

答案 0 :(得分:8)

是的,将自动调用父析构函数。

析构函数应该被虚拟化,因此可以通过认为它具有对基类实例的引用的代码来正确地销毁派生实例。

非常有限的情况下,如果确实需要在vtable查找中保存几个周期,则不进行虚拟化。

答案 1 :(得分:4)

对虚拟析构函数的需求是因为多态性。如果您有以下内容:

 class A { ... };

 class B : public A { ... };

 void destroy_class(A* input)
 {
     delete input;
 }

 int main()
 {
     B* class_ptr = new B();
     destroy_class(class_ptr); //you want the right destructor called

     return 0;
 }

虽然有点人为的例子,当你删除destroy_class()函数的传入指针时,你想要调用正确的析构函数。如果class A的析构函数未声明为virtual,则只会调用class A的析构函数,而不是class B的析构函数或{{1}的任何其他派生类型}}。

这样的东西通常是非模板多态数据结构等的事实,其中单个删除函数可能必须删除某些基类类型的指针,这些指针实际指向一个对象。衍生类型。

答案 2 :(得分:2)

rubixibuc,

是的,首先调用子类析构函数,然后调用它的超类......然后是超类,依此类推,直到我们找到Object的析构函数。

更多信息:http://www.devx.com/tips/Tip/13059 ...值得一读...只有一个屏幕已满,但这是一个充满信息的屏幕。