【问题标题】:C++ Virtual DestructorsC++ 虚拟析构函数
【发布时间】:2011-08-12 18:14:45
【问题描述】:

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

我的问题的第二部分是关于第一部分。为什么基类析构函数需要声明为virtual。不要构造函数在层次结构中循环。他们不共享相同的名字,那么哪里需要它?它不应该对析构函数起作用吗,或者默认情况下只有一个被调用?另外通过后期绑定是否能够检测到所有的类和对象是由什么组成的?

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

【问题讨论】:

标签: c++ virtual-destructor


【解决方案1】:

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

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

非常有限的情况下,如果你真的需要在vtable查找上节省几个周期,不进行虚拟化是可以的。

【讨论】:

  • virtual 关键字对析构函数和复制构造函数的应用是否不同?我问复制建设者,因为它是同一个想法的一部分。使用 memeber 函数,您可以拥有的唯一不同是类的返回类型。所有参数和函数名称必须相同。这些其他函数(析构函数复制 ctor)如何在运行时表示?它们都具有相同的名称,还是按顺序调用?对所有问题感到抱歉,只是真的很想了解它:-/。
  • 基本上,即使名称不同,在继承层次结构中声明更高层的析构函数也会向下传递到所有析构函数?
  • 是的。构造函数和析构函数名称与常规方法名称不同;特殊的 classname::classname 和 classname::~classname 语法告诉编译器它是构造函数或析构函数,因此继承查找构造函数/析构函数,而不是特定的类名
【解决方案2】:

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

 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 的任何其他派生类型不会被调用。

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

【讨论】:

    【解决方案3】:

    鲁比布克

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

    更多内容:http://www.devx.com/tips/Tip/13059 ...值得一读...只有全屏,但它是信息性全屏。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 2017-05-31
      • 2016-08-14
      • 1970-01-01
      • 2018-11-26
      • 2013-07-06
      • 2012-04-13
      • 2017-01-27
      • 2010-10-24
      相关资源
      最近更新 更多