如果我有一个基类和一个派生类,并且我删除了父虚类中的析构函数,但实例化了一个子类类型的对象,当它被销毁时,它会调用父析构函数吗(因为是虚的)?如果我还在派生类中声明了析构函数,它是否会同时调用析构函数(基类和派生类)。提前感谢:-)。
我问题的第二部分是关于第一部分。为什么基类析构函数需要声明为virtual。不要让构造器在hiearchy中循环。它们的名字并不相同,所以有什么必要这样做呢?它不应该对析构函数起同样的作用,或者默认情况下只调用一个吗?同样,通过后期绑定,它是否能够检测到所有的类和对象是由什么组成的?
编辑:我的问题不仅仅是关于虚拟析构函数,而且为什么需要声明为虚拟的,因为它们都应该在默认情况下被调用。
发布于 2011-04-26 12:45:18
是的,父析构函数将被自动调用。
析构函数应该虚拟化,这样派生实例才能被认为具有基类实例引用的代码正确销毁。
在非常有限的情况下,如果您真的需要在vtable查找上节省几个周期,那么不进行虚拟化是可以的。
发布于 2011-04-26 12:45:10
需要虚拟析构函数是因为多态。如果您有类似以下内容的内容:
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。
这样的东西通常是非模板多态数据结构等的实际情况,其中单个删除函数可能必须删除某些基类类型的指针,这些指针实际上指向派生类型的对象。
发布于 2011-04-26 12:47:22
rubixibuc,
是的,子类析构函数首先被调用,然后它是超类...然后它是超类,依此类推,直到我们到达Object的析构函数。
更多信息请点击这里:http://www.devx.com/tips/Tip/13059 ...值得一读……只有满屏,但这是一个信息量很大的全屏。
https://stackoverflow.com/questions/5785976
复制相似问题