virtual destructor有什么用的?

mongmong 2003-01-26 11:57:06
MSDN的解释如下:

Using virtual destructors helps ensure that the correct destructor is called
when instances of derived classes are deleted

但是还是不能区分virtual destructor和普通的destructor行为上有什么不同

哪位能举个例子出来,thx!
...全文
307 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifanxi 2003-01-28
谢谢cwanter(小菜) ,TopCat(令狐虫)等各位朋友指点。
实在很不好意思,好久以前看的Effective,也没有深刻的领会,没有记清楚,弄错了。
现在我重温了一下,终于又弄明白了。
对于我的错误回答给各位朋友带来的误导我表示非常的抱歉。
回复
lifanxi 2003-01-27
class A
{
public:
~A() {}
};
class B:public A
{
public:
~B() {}
};
这样话,B析构时不会去调用A的析构函数,如果A中有堆资源分配且释放在是A的析构函数中的话,B析构时就会造成内存泄漏。
用了virtual ~A()就好。
详细的内容和例子您可以参考一下Effective C++一书。
回复
TopCat 2003-01-27
to Byron:B析构时不会去调用A的析构函数
不是这样,B派生自A,析构时总是会先调用~B,然后调用~A

事实上virtual destructor的最重要的用途是为了给这个类制造一个vtable

---------------
这没错,但是下面这个例子中,就不一样了:

A *pt = new B();

这时,如果A的destructor不是virtual,析构时就会直接调用A::dtor而不会去调用B::dtor了。当然,制造一个vtbl也是virtual dtor的用途之一。
回复
GaoYakun 2003-01-27
to Byron:B析构时不会去调用A的析构函数
不是这样,B派生自A,析构时总是会先调用~B,然后调用~A

事实上virtual destructor的最重要的用途是为了给这个类制造一个vtable

回复
alan118 2003-01-27
virtual destructor is mainly used like below
Base *p=new Derived;
if(no virtual destructor)
call Base destructor and will not call Derived destructor when destructing;
but *p is a object of Derived;
so it will incur memory leak;
virtual destructor will confirm that the object calls the correct destructor and be correctly destructed;
回复
StudentIT 2003-01-27
同意lifanxi(Byron)
他说很清楚了。
回复
nothing707 2003-01-27
小菜同志辛苦了~~~
回复
windcsn 2003-01-27
同意 lifanxi(Byron)
虚析构在继承类后必须重新改写,那样父类是没有事例的,对于A的所有资源分配都由继承类来处理
回复
fixopen 2003-01-27
TopCat(令狐虫)说得对,如果不作为基类的话,虚析构是没有用的,因为虚表也没有用。
而作为基类,为了满足多态性的要求,一般应该采用虚析构。C++200x标准会改为默认虚析构的,因为虚析构是如此的常用。

class A
{
//....
};

class B : pubic A
{
//....
};

其中,A一般定义一个通用的接口,而B是A的一个特定的实现,我们的算法可以针对A来完成,这样,它就可以适应B以及任意从A派生出的类。如果我们的算法中涉及到结束A,也就是说,调用了A的析构函数,那么,我们希望如果它不是A的对象,而是B或者其他派生类的对象的时候,也能调用正确的析构函数,例如:delete pA;可以调用到B或任意其他派生类的析构函数,只要你的析构函数是虚的,这不正是虚函数的特点么:)。
回复
liuns 2003-01-27
在CSDN中强调了“derived classes ”是有他的用意的。MSDN的意思大概就是指的可以更安全的使用析构函数
回复
x2jack 2003-01-27
主要是在继承中应用,在子类中重新定义析构函数,去处理子类中新的成员。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告