首页 > 代码库 > 【C++基础 08】virtual析构函数的作用

【C++基础 08】virtual析构函数的作用

在面向对象语言中,接口的多种不同的实现方式即为多态。c++可以使用virtual来实现多态。

如果不使用virtual的话,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(也就是迟后绑定,运行的时候才确定调用哪个对象)。

关于virtual的用法比较简单,不再复述,我们这次来看看virtual析构函数的作用。

1.示例

我们先来看一段代码:

class A
{
public:
  ~A()
  {
    cout<<"~A()";
  }
};

class A1 : public A{
public:
  ~A1()
  {
    cout<<"~A1()";
  }
};

void main()
{
  A* a = new A1();//基类指针接受子类对象
  delete a;
  return;
}
咋一看好像没什么问题,但运行一下你会发现输出的结果是~A()。

也就是说只析构了基类的对象,没有释放子类的对象,造成局部销毁这种诡异的资源泄漏问题。

消除这种问题的做法也很简单,给基类添加一个virtual析构函数,此后删除子类就会销毁整个对象。

2.实现:

class A
{
public:
	virtual ~A()
	{
		cout<<"~A()";
	}
};

class A1 : public A{
public:
	~A1()
	{
		cout<<"~A1()";
	}
};

void main()
{
	A* a = new A1();
	delete a;
	return;
}
加上virutal关键字后,运行结果:先是子类的析构~A1() 然后是基类的析构~A()。整个对象被销毁,不存在局部销毁问题。


一个比较好的判断方式是:如果你的基类(base classes)设计是为了多态用途,那么它应该声明一个virtual析构函数,如果classes带有任何virtual函数,那么它也应该有一个virtual析构函数。