分享
 
 
 

思考virtual析构

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

Author:zfive5(zhaozidong)

Email:zfive5@yahoo.com.cn

最近同住的朋友忙着找工作,他C++的问题看了一堆,我也受其影响复习了一些C++知识, virtual析构听他说“点播率还挺高的”,所以拿来仔细研究,求个深解!

首先,定义3个类,注意了析构函数的virtual 说明

class ZF5_1

{

public:

ZF5_1()

{

}

virtual ~ZF5_1()

{

printf("Hello ZF5_1\r\n");

}

};

class ZF5_2:public ZF5_1

{

public:

ZF5_2()

{

};

virtual ~ZF5_2()

{

printf("Hello ZF5_2\r\n");

};

};

class ZF5_3:public ZF5_2

{

public:

ZF5_3()

{

};

virtual ~ZF5_3()

{

printf("Hello ZF5_3\r\n");

};

};

然后执行代码:

ZF5_1 *p5=new ZF5_3;

delete p5;

1.如果都有virtual

输出:

Hello ZF5_3

Hello ZF5_2

Hello ZF5_1

2.如果都去掉virtual

输出:

Hello ZF5_1

3.如果只去掉ZF5_2的virtual

输出:

Hello ZF5_3

Hello ZF5_2

Hello ZF5_1

第一种情况

虽然delete是基类指针,但由于有virtual析构声明,所以delete调用的派生类的析构(派生类用自己的析构函数指针重写虚函数表),然后派生类析构完成后再调用直接基类析构(C++就是这样规定的,编译器隐含这个过程,通过看汇编代码,一切机理ok),这样一级级的调用,就出现了第一种输出!

第二种情况

由于没有virtual修饰,所以delete调用是默认的ZF5_1析构,出现第二种输出就理所当然了。

第三种情况

由于ZF5_1用virtual修饰,所以以后所有它的派生类用自己的析构函数指针重写虚函数表里的对应的位置,以至出现与第一种情况相同的结果!

有一种情况没有表达,就是如果定义如下:

virtual ZF5_1

ZF5_2

ZF5_3

ZF5_4

ZF5_2 *p1=new Z5_4;

delete p1;

输出:

Hello ZF5_4

Hello ZF5_3

Hello ZF5_2

Hello ZF5_1

这种情况在VC6下,只要有基类virtual声名,以后的派生类都自动加上virtual,不知道gcc和cb是怎样处理这种情况的!有机会验证一下,对了很有可能是C++标准规定,看来还得先去翻翻C++ Primer了。

ZF5_3析构完成后默认调用ZF5_2析构汇编代码:(VC6环境下)

52: ~ZF5_3()

53: {

004013E0 push ebp

004013E1 mov ebp,esp

004013E3 sub esp,44h

004013E6 push ebx

004013E7 push esi

004013E8 push edi

004013E9 push ecx

004013EA lea edi,[ebp-44h]

004013ED mov ecx,11h

004013F2 mov eax,0CCCCCCCCh

004013F7 rep stos dword ptr [edi]

004013F9 pop ecx

004013FA mov dword ptr [ebp-4],ecx

004013FD mov eax,dword ptr [ebp-4]

00401400 mov dword ptr [eax],offset ZF5_3::`vftable' (00423044)

54: printf("Hello ZF5_3\r\n");

00401406 push offset string "Hello ZF5_3\r\n" (00424050)

0040140B call printf (00401e40)

00401410 add esp,4

55: };

00401413 mov ecx,dword ptr [ebp-4]

00401416 call @ILT+145(ZF5_2::~ZF5_2) (00401096)

0040141B pop edi

0040141C pop esi

0040141D pop ebx

0040141E add esp,44h

00401421 cmp ebp,esp

00401423 call __chkesp (00401e00)

00401428 mov esp,ebp

0040142A pop ebp

0040142B ret

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有