虚析构函数
- 哪些为函数不能实现为虚函数?
- 虚函数要能产生函数地址,并记录在虚函数表中。
- 对象必须存在(vfptr->vftable->虚函数地址)。
- 构造函数不能是虚函数,不满足第二点。且构造函数中调用的函数都是静态绑定的。过程是:先调用基类的构造函数,欲使用动态绑定,但此时还没有执行派生类的初始化,无法使用派生类的方法,因此不能使用动态绑定。
- 静态成员方法,不满足第二点。
- 虚析构函数
- 析构函数调用时,对象是存在的。
- 什么时候一定要实现虚析构函数?
- 基类的指针pb(引用)指向堆上的派生类对象,delete pb不会调用派生类析构函数,可能造成内存泄漏,因此必须将基类析构函数实现为虚函数。
class Base
{
public:
Base(int data = 10) : ma(data) { cout << "Base" << endl; }
virtual ~Base(){ cout << "~Base" << endl; }
virtual void show() { cout << "Base::show()" << endl; }
virtual void show(int) { cout << "Base:show(int)" << endl; }
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data = 20) : Base(data), mb(data) { cout << "Derive" << endl; }
~Derive(){ cout << "~Derive" << endl; } // 自动成为虚函数,会覆盖基类虚析构函数
void show() { cout << "Derive::show()" << endl; }
private:
int mb;
};
int main()
{
Base* pb2 = new Derive(10);
delete pb2; //如果基类的析构函数非虚函数,那么就是静态绑定,只执行析构base,派生类未析构,可能造成内存泄露
return 0;
}
标签:函数,30,派生类,析构,基类,虚析构,构造函数
From: https://www.cnblogs.com/sio2zyh/p/17987524