虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类的指针在释放时无法调用到子类的析构代码

解决方式:将父类中的析构代码函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

可以解决父类指针释放子类对象

都需要有具体的函数实现

虚析构和纯虚析构的区别

如果是纯虚析构,该类属于抽象类,无法实例化对象

虚析构语法:

virtual ~类名(){}

纯虚析构语法:

virtual ~类名()=0;

类名::类名(){}

示例:

#include
using namespace std;
class Animal
{
public:
	//纯虚函数
	virtual void speak() = 0;
	Animal()
	{
		cout << "Animal构造函数的调用" << endl;
	}
	//利用虚析构可以解决 父类在释放子类对象时不干净的问题
	//virtual ~Animal()
	//{
	//	cout << "Animal析构函数的调用" << endl;
	//}
	//纯虚析构 需要声明 也需要实现
	//有了纯虚析构之后,这个类也称为抽象类,无法实例化对象
	virtual ~Animal() = 0;
};
Animal::~Animal()
{
	cout << "纯虚析构函数的调用" << endl;
}

class Cat:public Animal
{
public:
	virtual void speak()
	{
		cout <<*m_Name<< "小猫在说话" << endl;
	}
	Cat(string name)
	{
		cout << "Cat构造函数的调用" << endl;
		m_Name = new string (name);
	}
	~Cat()
	{
		cout << "Cat析构函数的调用" << endl;
		if (m_Name != NULL)
		{
			delete m_Name;
			m_Name = NULL;
		}
	}
	string* m_Name;
};
void test01()
{
	Animal* animal = new Cat("longlong");
	animal->speak();
	delete animal;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

虚析构和纯虚析构_第1张图片

你可能感兴趣的:(c++,开发语言)