c++ --虚析构和纯虚析构
在c++中,我们知道在类内有些对象的成员需要在堆区创建空间,比如数组,其他类的对象做自己类的成员时需要创建空间,但是在调用多态中,需要父类指针或引用子类对象,那么在父类销毁指针时会调用父类的析构函数,那么子类的析构函数就不会被调用了,然后子类在堆区创建的空间就无法通过析构函数进行删除了,就会导致内存泄露,所以就要用虚析构或者纯虚析构来解决
语法
虚析构和纯虚析构的语法和虚函数与纯虚函数的语法相同
虚析构 virtual ~类名(){}
纯虚析构 virtual ~类名()=0;
代码
#include<iostream>
#include<string>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "animal类构造函数调用" << endl;
}
/*virtual ~Animal()
{
cout << "animal虚析构函数调用" << endl;
}*/
virtual ~Animal() = 0;
//纯虚函数
virtual void speak() = 0;
};
Animal::~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;
}
~Cat()
{
if (this->m_name != NULL)
{
cout << "cat类析构函数调用" << endl;
delete m_name;
m_name = NULL;
}
}
string* m_name;
};
void test01()
{
string name1;
cout << "请输入小猫名字" << endl;
cin >> name1;
Animal* ani = new Cat(name1);
ani->speak();
delete ani;
}
int main()
{
test01();
system("pause");
return 0;
}
然后需要注意的是,无论是虚析构还是纯虚析构都需要有声明和实现
在代码中可以看到纯虚析构函数在类中进行了声明,然后在类外进行了定义
若无定义则运行会出错
当然如果子类中没有在堆区开辟数据,那么可以不需要父类写虚析构或者纯虚析构
有纯虚析构的父类也是抽象类