c++虚析构函数
C++ Virtual Destructors
如果我有一个基类和一个派生类,并且我在父类虚类中声明析构函数,但是实例化一个子类类型的对象,当被销毁时它将调用父类析构函数对吗?如果我也在派生类中声明析构函数,它会同时调用两个析构函数(基类和派生类)吗?提前谢谢:-).
我问题的第二部分是关于第一部分的。为什么需要将基类析构函数声明为虚函数。不要在层次结构中循环构造函数。他们没有相同的名字,所以有什么必要呢?它对析构函数的工作方式不应该是一样的吗,或者默认情况下只调用一个?此外,通过延迟绑定是否能够检测所有的类和对象组成?
编辑:我的问题不仅仅是关于虚析构函数,而是为什么它需要被声明为虚的,因为它们都应该被默认调用。
是,父类析构函数将被自动调用。
析构函数应该被虚拟化,这样派生实例就可以被认为有基类实例引用的代码正确地销毁。
在非常有限的情况下,如果确实需要节省虚值表查找的几个周期,则不虚拟化是可以的。
需要虚析构函数是因为多态性。如果您有如下内容:
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…值得一读……只是一个满屏,但它是一个信息满屏。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误