c++虚析构函数

C++ Virtual Destructors

本文关键字:析构函数 c++      更新时间:2023-10-16

如果我有一个基类和一个派生类,并且我在父类虚类中声明析构函数,但是实例化一个子类类型的对象,当被销毁时它将调用父类析构函数对吗?如果我也在派生类中声明析构函数,它会同时调用两个析构函数(基类和派生类)吗?提前谢谢:-).

我问题的第二部分是关于第一部分的。为什么需要将基类析构函数声明为虚函数。不要在层次结构中循环构造函数。他们没有相同的名字,所以有什么必要呢?它对析构函数的工作方式不应该是一样的吗,或者默认情况下只调用一个?此外,通过延迟绑定是否能够检测所有的类和对象组成?

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

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

析构函数应该被虚拟化,这样派生实例就可以被认为有基类实例引用的代码正确地销毁。

非常有限的情况下,如果确实需要节省虚值表查找的几个周期,则不虚拟化是可以的。

需要虚析构函数是因为多态性。如果您有如下内容:

 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的析构函数或class A的任何其他派生类型。

对于非模板多态数据结构等来说,这样的东西通常是不可避免的,其中单个删除函数可能不得不删除某些基类类型的指针,这些指针实际上指向派生类型的对象。

rubixibuc,

是的,首先调用子类析构函数,然后是超类…然后是它的超类,以此类推,直到我们到达对象的析构函数。

更多在这里:http://www.devx.com/tips/Tip/13059…值得一读……只是一个满屏,但它是一个信息满屏。