返回信息流class A
{
public:
A(){cout<<"cons A"<<endl;}
virtual ~A(){cout<<"des A"<<endl;}
};
class B:public A
{
public:
B(){cout<<"cons B"<<endl;}
~B(){cout<<"des B"<<endl;}
};
A* a = new B;
delete a;
为什么调用的是 B的析构函数 然后A的析构函数
换句话说,编译器怎么找到A的析构函数地址的?B的析构函数通过虚函数表能找到
这是一条镜像帖。来源:北邮人论坛 / cpp / #79173同步于 2014/5/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
虚析构函数问题
iliketour
2014/5/6镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
析构函数是虚函数,所以调用的是B的析构函数。编译器在编译的时候会在B的析构函数后面扩展一段代码调用基类的析构函数。
其实析构的过程是这样:
1、执行析构函数
2、执行所有成员对象的析构函数(如果有),顺序与构造函数相反
3、重设vptr为指向基类的vtable
4、调用所有直接基类的析构函数(以基类声明相反的顺序)
5、调用虚基类的析构函数(如果当前类是最顶端的类),顺序与构造顺序相反。
除了1,其余的都是编译器自动安插的代码。
建议看看muduo作者陈硕的文章http://blog.csdn.net/haoel/article/details/3081328
还有effective c++里面关于虚拟析构函数的条款。
不错。lippman大师用了一本书来介绍C++的对象模型,也可以参考下。
【 在 rollse 的大作中提到: 】
: 建议看看muduo作者陈硕的文章http://blog.csdn.net/haoel/article/details/3081328
: 还有effective c++里面关于虚拟析构函数的条款。
说的很详细 谢谢了
【 在 gaoweiwei 的大作中提到: 】
: 析构函数是虚函数,所以调用的是B的析构函数。编译器在编译的时候会在B的析构函数后面扩展一段代码调用基类的析构函数。
: 其实析构的过程是这样:
: 1、执行析构函数
: ...................
非常感谢,还问一个:虚表放在哪?代码段吗?函数体应该是代码段吧。
【 在 gaoweiwei 的大作中提到: 】
: 析构函数是虚函数,所以调用的是B的析构函数。编译器在编译的时候会在B的析构函数后面扩展一段代码调用基类的析构函数。
: 其实析构的过程是这样:
: 1、执行析构函数
: ...................
虚函数放在代码段,但各种虚表都放在数据段(.rdata)里。
【 在 iliketour 的大作中提到: 】
: 非常感谢,还问一个:虚表放在哪?代码段吗?函数体应该是代码段吧。