Effective C++ (E3 7)笔记之为多态基类声明virtual析构函数

#include<iostream>
#include<memory>
using namespace std;

class A
{
public:
    A(){
        cout<<"A: cons"<<endl;
    }
    virtual ~A(){
        cout<<"A: des"<<endl;
    }
    virtual void print(){
        cout<<"A: print"<<endl;
    }
};

class AA:public A
{
public:
    AA(){
        cout<<"AA: cons"<<endl;
    }
    virtual ~AA(){
        cout<<"AA: des"<<endl;
    }
    virtual void print(){
        cout<<"AA: print"<<endl;
    }
};

int main(int argc,char* argv[])
{
    A* a_p = new AA(); //指向派生类的基类指针,实现多态
    a_p->print();
    delete(a_pp);	//若基类析构非virtual,则仅仅析构基类部分

    A aa;	//无论基类析构是否virtual,程序结束时基类、派生类都将被析构。因为是栈上自动回收,aa同时包含AA和A的部分。
    return 0;
}


为多态基类声明virtual析构函数
否则,通过基类指针去delete,只能析构基类而派生类没有被回收。
因为基类的析构函数没有多态特性,只会析构基类而已。

一味将析构指定为virtual或非virtual都是不对的。
一般,带有virtual成员函数的类可被认为是多态基类,声明其析构为virtual。

为啥base类的virtual析构函数和derived类的析构函数名称不一样,却可以实现多态?
可认为析构函数不是命名为~className(),而是~。

参见:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值