30虚析构函数

虚析构函数

  • 哪些为函数不能实现为虚函数?
    • 虚函数要能产生函数地址,并记录在虚函数表中。
    • 对象必须存在(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;
}
posted @ 2024-01-25 16:47  SIo_2  阅读(21)  评论(0)    收藏  举报