0
点赞
收藏
分享

微信扫一扫

C++ --虚析构和纯虚析构

虚析构和纯虚析构

前言: 当使用父类指针指向子类对象,delete指针时,只会调用父类的析构函数,而不会调用子类的析构函数。这就存在子类对象没被释放的问题,导致内存泄漏

  • 父类上使用虚析构纯虚析构都能解决上面的问题,但是需要注意:纯虚析构也要有具体实现;且如果包含了纯析构函数,则变成了一个抽象类。
  • 形式:virtual ~父类名() {}
//虚析构和纯虚析构
//场景:当使用父类指针指向子类对象,delete指针时,只会调用父类的析构函数,而不会调用子类的析构函数。这就存在子类对象没被释放的问题,导致内存泄漏
//父类上使用虚析构和纯虚析构都能解决上面的问题,但是需要注意:纯虚析构也要有具体实现;且如果包含了纯析构函数,则变成了一个抽象类。
//形式:virtual ~父类名() {}
class Base
{
public:
	virtual void function() = 0;
	Base()
	{
		cout << "Base构造函数\n";
	}
	//虚析构
	virtual ~Base()
	{
		cout << "Base析构函数\n";
	}
};
class Son : public Base
{
public:
	//属性创建在堆上
	int* p_age;
	void function()
	{
		cout << "Son is working " << *p_age << endl;
	}
	Son(int age)
	{
		p_age = new int(age);
		cout << "Son构造函数\n";
	}
	~Son()
	{
		if (p_age != NULL)
		{
			delete p_age;
			p_age = NULL;
		}
		cout << "Son析构函数\n";
	}
};
void test()
{
	Base* b = new Son(20);
	b->function();
	delete b;
}
int main()
{
	test();
	return 0;
}
举报

相关推荐

0 条评论