在上一篇博文《关于C++对象的自杀》末尾提到了基类的虚析构函数,于是再添一篇。
什么时候析构函数需要加个virtual来修饰呢?
当要通过指向基类的指针删除子类对象时。
Why?
这是为了保证基类和子类的析构函数都得到调用。
个人理解:因为基类类型的指针指向的是子类对象中的基类部分,如果析构函数不为虚函数,则无法调用到子类的析构函数。
如下代码:
输出为:
说明了基类析构函数不为虚函数时,delete指向基类的指针时无法调用到子类的析构函数。
将基类析构函数修改为虚函数,得到如下代码:
输出为:
此时,子类的析构函数得到调用。
个人理解:
这是因为基类中将析构函数声明为虚函数,则析构函数(的索引/指针)会被放在虚表vtbl中。
在继承过程中,vtbl属于基类部分,即基类类型的指针p可以指到的范围。
并且,析构函数的虚函数性质会在继承过程中得到保持(虽然函数名不同),于是子类的析构函数也位于虚表中,确保delete p时可以调用到子类的析构函数。
于是,析构函数自底向上得到调用了。
最后引用C++ FAQ的一个段落:
BTW, if you're interested, here are the mechanical details of
why youneed a virtual destructor when someone says delete using a Base pointerthat's pointing at a Derived object. When you say delete p,
and theclass of p has a virtual destructor, the destructor that getsinvoked is the one associated with the type of the object
*p, notnecessarily the one associated with the type of the pointer.
This is A GoodThing. In fact, violating that rule makes your program undefined. Thetechnical term for that is, "Yuck."
分享到:
相关推荐
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
虚析构函数示例 c++析构函数是否是虚函数时的差别,敬请留意
C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
c++ virtual 虚析构函数及虚函数的详细例子.rar
虚析构函数 析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非...
C++析构函数使用virtual的原因
本文给大家分享了避免析构函数调用虚函数。
//析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...
构造函数不能声明为虚函数,析构函数可以声明为虚函数。
本篇文章是对C++中虚析构函数的作用进行了详细的分析介绍,需要的朋友参考下
本文给大家介绍了C++中确定基类有虚析构函数的方法。
在C++中,不能声明虚构造函数,但可以声明虚析构函数。多态性是指不同的对象对同一消息有不同的行为特性。虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有...
主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者...
1、原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子: (1)、 #include using namespace std; class Base{ public: Base() {};...
析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
C++箴言:避免析构函数调用虚函数[归类].pdf