2011-04-26 136 views
3

如果我有一个基类和一个派生类,并且我在父虚拟中析构函数delcare,但是实例化一个类型为子类的对象,当它被销毁时它会调用父析构函数的权利(因为虚拟)?如果我还在派生类中声明了析构函数,它是否会调用析构函数(基类和派生类)。提前致谢 :-)。C++虚拟析构函数

我的问题的第二部分是关于第一部分。为什么基类析构函数需要声明为虚拟的。不要考虑循环式的结构。他们不分享同一个名字,那么对它的需求在哪里?它不应该像destrucotrs一样工作,或者默认情况下只有一个被称为?也可以通过后期绑定来检测所有的类和对象是由什么组成的?

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

+1

嗯,你的第一段回答第二个。这在任何体面的C++语言书中都有介绍。并在*相关*部分的权利的问题。 – 2011-04-26 04:42:19

+1

[虚拟析构函数如何工作?](http://stackoverflow.com/questions/2722537/how-do-virtual-destructors-work) – 2011-04-26 04:42:52

+0

@Hans,我有一本书,它不包括在所有。 – rubixibuc 2011-04-26 04:44:51

回答

8

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

应该对析构函数进行虚拟化,以便派生实例可以被认为具有对基类实例的引用的代码正确销毁。

非常有限的情况下,它是确定不能虚拟化,如果你真的需要节省虚函数表查找几个周期。

+0

是否将virtual关键字以不同方式应用于析构函数和复制构造函数?因为它是同一个想法的一部分,所以我要求副本构造者。使用memeber函数,您可以拥有的唯一区别是该类的返回类型。所有参数和功能名称必须相同。这些其他函数(析构函数复制ctors)如何在运行时表示?他们是否都有相同的名字,或者他们是按顺序? Sry提出所有问题,只是想真正理解它: - /。 – rubixibuc 2011-04-26 04:54:57

+0

基本上,在继承层次结构中声明析构函数高于所有析构函数,即使名称不同? – rubixibuc 2011-04-26 04:56:51

+0

是的。构造函数和析构函数名称不像常规方法名称;特殊的classname :: classname和classname ::〜classname语法告诉编译器它是一个构造函数或析构函数,所以继承查找构造函数/析构函数,而不是特定的类名 – 2011-04-26 05:05:29

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

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

2

rubixibuc,

呀子类的析构函数首先被调用,那么它的超类......那么它的父类,依此类推,直到我们到达对象的析构函数。

更多这里:http://www.devx.com/tips/Tip/13059 ...这是值得的阅读......只有一个屏幕满,但它是一个INFORMATIVE屏幕全。