虚析构函数

来源:互联网 发布:移动数据网怎么转电信 编辑:程序博客网 时间:2024/04/30 23:06

Class A{}

ClassB:public A{}

ClassC:public B{}

 

在一般的使用下,如C c;如果存在继承派生关系,当构造一个子类对象时,会先从最上层先调用基类的构造函数构造基对象,然后逐步往下,最后调用子类的构造函数完成子类对象的构造,而当销毁子类对象时,会按照相反顺序,先调用子类的析构函数,然后调用基类的析构函数,最后完成一个对象的析构。

注意,这是正常的使用情况下的方式,这种多态用得最简单。

但是,考虑一种情况,当你通过一个基类的指针去析构一个子类对象时,会发生什么情况呢?如A *p = new C();delete p;结果显而易见,这样的析构只会调用基类的析构函数,而没有调用子类的析构函数,导致析构异常,因为非虚函数的调用是根据调用者的类型来寻址的,因为析构时给出的是基类的类型指针A*,所以当然会调用基类的析构函数,但是这种情况不是我们所希望的。

因此,这个时候就要用到虚析构函数了,而虚函数的调用是通过对象来决定的,因为虚函数是通过虚函数表来寻址的,而虚函数表又存储在对象当中,当把父类的析构函数声明为虚析构函数时,通过父类的指针去析构子类对象就不会发生析构异常,这样的析构会像正常情况下那样,会先调用子类的析构函数,然后调用父类的析构函数从而完成整个继承链上的析构,避免了析构异常的问题

原创粉丝点击