首页 新闻 会员 周边

虚析构函数

0
悬赏园豆:20 [待解决问题]

#include <IOSTREAM>
class A
{
public:
A ()
{

}
virtual ~A()
{
std::cout
<<"A freeconstructor"<<std::endl;
}
};
class B:public A
{
public:
B ()
{

}
~B()
{
std::cout
<<"B freeconstructor"<<std::endl;
}
};
class C:public B
{
public:
C ()
{

}
~C()
{
std::cout
<<"C freeconstructor"<<std::endl;
}
};
int main(void)
{
A
*p = new C;
delete p;
while(1);
return 0;
}

运行结果:

C freeconstructor

B freeconstructor

A freeconstructor

谁能帮我解释一下为什么不是

B freeconstructor

A freeconstructor

Small-Chao的主页 Small-Chao | 初学一级 | 园豆:180
提问于:2011-05-30 15:50
< >
分享
所有回答(2)
0

析构函数的调用顺序是:先调用自身,然后是基类的析构函数。

Jerry Chou | 园豆:2642 (老鸟四级) | 2011-05-30 17:09
问题是这个时候是基类指针啊,它有地址偏移,而B的析构函数不是虚函数,通过基类指针释放也会正确释放吗?
支持(0) 反对(0) Small-Chao | 园豆:180 (初学一级) | 2011-05-30 22:38
To:B的析构函数不是虚函数,通过基类指针释放也会正确释放吗?

你的问题集中在:为什么B的析构函数不是virtual,但是却被调用了?
原因是:当基类(A)的dtor是virtual时,其子类的dtor自动为virtual。

你看下:
http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7
注意它的Note:
in a derived class, if your base class has a virtual destructor, your own destructor is automatically virtual.

其实C++操蛋的地方就在这里,为你做了你不知道的事 :)
支持(0) 反对(0) Jerry Chou | 园豆:2642 (老鸟四级) | 2011-05-31 09:18

学习了

支持(0) 反对(0) ShaPherD | 园豆:275 (菜鸟二级) | 2011-09-29 11:29
0

虚析构函数的作用是 “当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用”

A是基类,指向派生类的指针,并且析构函数是虚函数,所以其所有的派生类的析构函数都会被调用。

如果你用B的指针指向C,delete B的话,只会调用B的析构函数。

如果此时A的析构函数不是虚函数的话,此时只会调用A的析构函数。

 

你的疑点应该是 B的析构函数没有Virtual,为什么会调用B的析构函数。

这还是回到了虚析构函数的作用,是为了 当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用

好好理解这句话的意思。 因为你删的是A,而A的析构函数是虚的,当然A的派生类的析构函数会被调用,这个和派生类的析构函数是否为虚函数没有关系。

:)

不要边城 | 园豆:205 (菜鸟二级) | 2011-05-30 23:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册