本文主要是介绍虚析构和纯虚析构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构函数改为虚析构或者纯虚构
虚析构和纯虚构共性:
- 可以解决父类指针释放子类对象
- 都需要有具体的函数实现
虚析构和纯虚构的区别:
- 如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚构语法:
virtual ~类名()=0;
#include<iostream>
using namespace std;
#include<string>//虚析构和纯虚构
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);}virtual void speak(){cout <<*m_name<< "小猫想说话" << endl;}~Cat(){if (m_name != NULL){cout << "Cat析构函数调用" << endl;delete m_name;m_name = NULL;}}string *m_name;
};
void test1()
{Animal *animal = new Cat("Tom");animal->speak();//父类指针在析构时候 不会调用子类析构函数,导致子类如果有堆区属性,导致内存泄漏delete animal;
}
void test2()
{}
int main()
{test1();test2();system("pause");return 0;
}
这篇关于虚析构和纯虚析构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!