虚析构和纯虚析构原理
直接上代码:请根据编号查看代码说明。
先总结:
-
虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
-
如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
-
拥有纯虚析构函数的类也属于抽象类
animal类
//3.
class animal
{
public:
animal() { cout << "animal构造函数调用" << endl; }
//能调用子类析构函数 来释放堆区的解决方法:
//利用虚析构可以解决父类指针释放子类对象时不干净的问题
//virtual ~animal() { cout << "animal虚析构函数调用" << endl; }
//而如果想避免基类实例化,则可以将析构函数写成纯虚析构
//但因为派生类(子类)不可能来实现基类(父类)的析构函数,
//所以基类析构函数虽然可以标为纯虚,但是仍必须实现析构函数,
//否则派生类无法继承,也无法编译通过。
//纯虚析构 要声明也要实现(类外定义)
//有了纯虚析构之后,这个类也属于抽象类,并无法实例化对象
virtual ~animal() = 0;
virtual void speak() = 0;
};
//纯虚析构函数要类外定义
animal::~animal() { cout << "animal纯虚析构函数调用" << endl; }
cat类,里面继承了父类anim