码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-03 15:19:15      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:c++   c++基础   

在面向对象语言中,接口的多种不同的实现方式即为多态。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析构函数。

【C++基础 08】virtual析构函数的作用,布布扣,bubuko.com

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

标签:c++   c++基础   

原文地址:http://blog.csdn.net/shun_fzll/article/details/38357413

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!