C++中经常使用父类指针指向子类对象,这是多态实现的基础。但是,如果对父类的析构函数不作特殊处理的话,会隐含一个内存泄露的问题。
直接上代码:
//父类
class AA
{
public:
AA(int a =0 )
{
this->a = a;
std::cout<<"父类的构造函数\n";
}
virtual ~AA()
{
std::cout<<"父类的析构函数\n";
}
protected:
int a;
private:
};
//子类
class BB:public AA
{
public:
BB(int a =0 ,int b =0 )
{
this->a = a;
this->b = b;
std::cout<<"子类的构造函数\n";
}
~BB()
{
std::cout<<"子类的析构函数\n";
}
protected:
int b;
private:
};
//场景一:子类指针指向子类对象,当释放子类对象的时候,它会自动调用父类对象的析构函数。
void main()
{
BB *b1 = new BB(1,2);
delete b1;
/*
父类的构造函数
子类的构造函数
子类的析构函数
父类的析构函数
*/
system("pause");
}
//情形二:如果想通过父类指针 执行 所有的子类的析构函数,需要在父类的析构函数前加virtual关键字。
void main()
{
AA *a1 = new BB(1,2);
delete a1;
/*
父类的构造函数
子类的构造函数
父类的析构函数
竟然没有调用子类的析构函数,没有办法,只要在父类的析构函数前加virtual。
在父类的构造函数前加上virtual关键字,当释放父类指针指向的子类对象时,会自动调用子类的析构函数。
*/
system("pause");
}