Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;虚拟析构函数_C++_Virtual Destructor - Fatal编程技术网

C++ C++;虚拟析构函数

C++ C++;虚拟析构函数,c++,virtual-destructor,C++,Virtual Destructor,如果我有一个基类和一个派生类,并且我在父虚拟中删除析构函数,但是实例化了一个subclass类型的对象,当销毁时它会调用父析构函数(因为虚拟)?如果我还在派生类中声明析构函数,它会同时调用两个析构函数(基和派生)。提前感谢:-) 我的问题的第二部分是关于第一部分。为什么基类析构函数需要声明为虚拟的。不要让建筑工人在等级制度中循环。他们的名字不一样,哪里需要呢?它不应该对destrucotrs起同样的作用吗,或者默认情况下只调用一个?通过后期绑定,它是否能够检测所有类和对象的组成 编辑:我的问题不

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

我的问题的第二部分是关于第一部分。为什么基类析构函数需要声明为虚拟的。不要让建筑工人在等级制度中循环。他们的名字不一样,哪里需要呢?它不应该对destrucotrs起同样的作用吗,或者默认情况下只调用一个?通过后期绑定,它是否能够检测所有类和对象的组成


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

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

 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\u class()
函数的传入指针时,您希望调用正确的析构函数。如果
类A
的析构函数未声明为
虚拟
,则只会调用
类A
的析构函数,而不会调用
类B
的析构函数或任何其他派生类型的
类A


像这样的东西在非模板多态数据结构等中经常是一个事实。在这种情况下,单个删除函数可能必须删除某些基类类型的指针,这些指针实际上指向派生类型的对象。

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

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

在非常有限的情况下,如果您确实需要在vtable查找上节省一些周期,那么不进行虚拟化是可以的。

rubixibuc

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


更多信息请点击这里:。。。值得一读。。。只有满屏,但这是一个信息丰富的满屏。

Hmm,你的第一段回答了第二段。这是任何一本体面的C++语言书。相关部分的问题在右边。可能是@Hans的副本,我有一本书,但根本没有涉及。试试这个链接,这可能会有所帮助。Thank虚拟关键字对析构函数和复制构造函数的应用不同吗?我问复制商,因为这是同一想法的一部分。对于memeber函数,唯一不同的是类的返回类型。所有参数和函数名必须相同。这些其他函数(析构函数复制析构函数)在运行时是如何表示的?它们都有相同的名称,还是按顺序调用?Sry关于所有的问题,只是想了解一下:-/。基本上,在继承层次结构中声明更高级别的析构函数是否会继承到所有析构函数,即使名称不同?是的。构造函数和析构函数名称与常规方法名称不同;特殊的classname::classname和classname::~classname语法告诉编译器它是构造函数或析构函数,因此继承查找构造函数/析构函数,而不是特定的类名