C++为什么基类要用虚析构
析构函数:C++中对象使用结束后应当释放其占用的空间。
虚函数:父类中采用虚函数,子类重写虚函数实现多态。
为什么析构函数要声明是virtual函数?
父类指针指向子类对象实现多态
当子类在堆区开辟空间时,虽然在子类的析构函数中可以实现内存释放,但由于是父类指针指向子类对象,父类指针在执行其析构函数时,并不会触发子类对象的析构函数,会导致内存泄漏的出现。
不采用虚析构函数:
#include<iostream>
#include<string>
using namespace std;
class animal
{
public:
animal()
{
cout << "animal的构造函数" << endl;
}
//虚函数
virtual void speak() = 0;
~animal()
{
cout << "animal的析构函数" << endl;
}
};
class cat :public animal
{
public:
cat(string name)
{
cout << "cat的构造函数" << endl;
m_name = new string(name);//这个指针指向堆区数据
}
void speak()
{
cout << *m_name << " : 喵喵" << endl;
}
string* m_name;//小猫的名字指针,用来管理堆区数据
~cat()
{
cout << "cat的析构函数" << endl;
if (m_name != NULL)//释放堆区内存
{
delete m_name;
m_name = NULL;
}
}
};
void test1()
{
animal* a = new cat("Tom");
a->speak();
delete a;
}
int main()
{
test1();
system("pause");
return 0;
}
运行结果:
可见,cat类的析构函数并未被调用。
采用虚析构函数:
将animal类的析构函数改为:
virtual ~animal()
{
cout << "animal的析构函数" << endl;
}
运行结果为:
子类析构成功,内存释放。