C++:90---类继承(虚析构函数)

一、引入

二、虚析构函数

  • 使用方法和规则与虚函数一样
  • 格式要求:
    • 虚析构函数要求基类与派生类中的名称不一致
  • 只要基类的析构函数是虚函数,就能确保我们在释放指针时准确的运行哪个版本(基类or派生类)的析构函数
    • 如果基类指针指向于自己,那么delete的时候执行的就是自己的析构函数
    • 如果基类指针指向于派生类对象,那么delete的时候执行的就是派生类的析构函数(这个就是多态的性质,与执行虚函数的原理一样)
  • 如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为
  • 与虚函数一样,如果基类的析构函数为virtual,那么派生类的析构函数也都是virtual的(即使是编译器默认合成的也是virtual的)

三、虚析构函数的其它注意事项

  • ①前面我们介绍过如果一个类需要析构函数,那么它同样需要拷贝和赋值操作。但是基类的虚析构函数并不遵循这个规则:一个基类总是需要析构函数,而且它能将析构函数设定为虚函数,此时,该析构函数为了成为虚函数而令内容为空,我们显然无法由此推断该基类还释放需要复制运算符或拷贝构造函数
  • ②虚析构函数将阻止合成移动操作:基类需要一个虚析构函数这一事实还会对基类和派生类的定义产生另外一个间接的影响:如果一个类定义了析构函数,即使它通过default的形式使用了合成的版本,编译器也不会为这个类合成一定操作(见合成移动操作(待续))

四、演示案例

class A {
public:
    virtual ~A() = default;
};
class B:public A{
public:
    virtual ~B() override {}
};

int main()
{
	
    A *pa;
    pa = new B();
    delete pa; //执行B的虚构函数

    pa = new A();
    delete pa; //执行A的虚构函数

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值