| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1188 人关注过本帖
标题:关于虚析构函数的问题
只看楼主 加入收藏
quying257
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-11-29
收藏
 问题点数:0 回复次数:5 
关于虚析构函数的问题
用指向基类的 指针指向带有虚析构函数基类的派声类对象时。最后,多态时调用了派生类的 虚析构函数后还
调用基类的析构函数吗。
帮忙 告诉一下吧
想不明白啊
搜索更多相关主题的帖子: 函数 基类 多态 派生类 指针 
2007-12-02 12:25
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
对象退化,派生类对象的析构函数只负责它自身成员的清理工作,而派生类对象里的基类部分它不负责,要由基类的析构函数来负责。。
所以调用派生类的析构函数会产生对象退化,退化过程:
从派生类对象---->基类对象....这是最简单的一种退化~

樱花大战,  有爱.
2007-12-02 15:46
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
原帖由 [bold][underline]中学者[/underline][/bold] 于 2007-12-2 15:46 发表 [url=http://bbs.][/url]
对象退化,派生类对象的析构函数只负责它自身成员的清理工作,而派生类对象里的基类部分它不负责,要由基类的析构函数来负责。。
所以调用派生类的析构函数会产生对象退化,退化过程:
从派生类对象---->基类对象....这是最简 ...


不知道楼主是不是要的这个答案
我再对虚析构补充一点。

derive derive_obj;
base *p_base = &derive_obj;
delete p_base;

如果base类没有将析构函数定义为虚函数,那么这里的调用将会异常,因为系统会调用指针指向的静态类型base的析构函数,显然与期望不符合。

如果将base的析构作为虚函数,那么根据多态,这点就解决了,所以总把一个类的析构定义为虚函数是个好习惯。

Fight  to win  or  die...
2007-12-02 19:24
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
顺便对2楼的发言发表下看法。
首先我不说你错,因为我确实没验证过,也不知道怎么去验证。
我仅仅说说我所理解的,派生类的析构就类似派生类的构造函数一样,构造函数要调用基类的构造函数来创建一个子对象,如果没有显示指定,那么调用默认构造函数;析构也一样,派生类的析构函数同样会调用基类的析构函数来析构这个子对象,如果没有显示指定,那么调用的是默认析构函数(这个跟默认构造函数不一样,无论是否自定义,它总存在)。并且这是发生在析构派生类本身之前。

不存在你所说的退化,如果你所说的退化成立的话。
那么意味析构了一个派生类对象后,仍然可以通过它来调用基类方法,我没看到过。

Fight  to win  or  die...
2007-12-02 19:40
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
我原来和你的看法是一样的,总是认为编译器会为没有提供默认构造函数和析构函数的情况下提供,但是看了《深度探索C++对象模型》,我才知道,编译器并不会为所有没有提供默认构造函数和析构函数的类合成一个。。
所谓对象退化:(原书择录)
一个对象的声明结束于其destrucot开始执行之时,由于每一个base class destrutor都轮番被调用,所以derived object实际上变成了一个完整的object.例如一个PVertex对象归还其存储空间之前,会依次变成一个Vertex3d对象,一个Vetex对象,一个Point3d对象,最后成为一个Point对象...当我们在destructor中调用member functions时,对象的蜕变会因为vptr的重新设定而受到影响...(上面说的那些对象的层次: PVertex-->Vertex3d-->Vertex/Point3d(这里为多继承---->Point)

不知道是不是我理解错了,上面是原书上的.....给你分享~~~

樱花大战,  有爱.
2007-12-02 22:19
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
我也看过那书,也不知道你理解错了,还是我想错了,呵呵。

Fight  to win  or  die...
2007-12-03 16:28
快速回复:关于虚析构函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024716 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved