| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5372 人关注过本帖
标题:析构函数为什么不能声明为纯虚函数的形式?
只看楼主 加入收藏
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
以下是引用lz1091914999在2012-3-2 15:59:54的发言:

想想,构造和析构函数都有着特别的意义,这是与其它函数不同的,并且在一个类层次中析构函数都会被调用,那么如果一个类没有析构函数的定义,那么调用那一块代码呢?
但是如果需要一个函数体,那又怎么称得上是“纯”?它的唯一价值就是让这个类成为抽象类,所以不能创建这个类的对象,当然让其它成员函数成为纯的效果也一样。
但是继承一个有纯虚析构函数的类的时候,在派生类中可以不给出析构函数的定义,并且这个类也不是抽象类,这是与其它函数不同的地方(其它纯虚函数没有给出定义的话,这个类也是抽象类)。因为编译器自动帮我们生成了一个定义,所以也可以认为重写了父类的纯虚函数。所以你明白为什么编译器和链接器强迫我们为它提供一个函数体了嘛?
你的意思是不是说...假如基类析构函数是纯虚函数的话,按照纯虚函数的定义的话,派生类就无法执行析构函数销毁对象了?(假如派生类没有定义析构函数的话)

蹲得越低,跳得越高.
2012-03-02 20:38
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
以下是引用pangding在2012-3-2 18:22:34的发言:

额……我觉得楼主这个问题有陷阱的性质……
此话怎讲

蹲得越低,跳得越高.
2012-03-02 20:39
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
明明后者能通过编译,你非问为什么不能。回答的人还不是容易先入为主,然后百般解释为什么不能。

我先汗一把,要不是人 2楼 回答的快,我估计也得像4楼一样乱扯一通。
2012-03-02 21:45
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 11楼 CooperOne
主要目的是让基类不能创建对象。想想,如果你的析构函数只是虚函数,那么派生类中你不写函数体也可以通过编译,只不过用的是上一个基类的版本罢了。而纯虚析构函数
派生的类不写析构函数,那么就会用编译器生成的版本。区别就在这。

My life is brilliant
2012-03-02 21:48
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
以下是引用pangding在2012-3-2 21:45:34的发言:

明明后者能通过编译,你非问为什么不能。回答的人还不是容易先入为主,然后百般解释为什么不能。

我先汗一把,要不是人 2楼 回答的快,我估计也得像4楼一样乱扯一通。
冤枉啊...你的编译器是什么?我用VC6.0的

蹲得越低,跳得越高.
2012-03-03 00:55
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
以下是引用lz1091914999在2012-3-2 21:48:54的发言:

主要目的是让基类不能创建对象。想想,如果你的析构函数只是虚函数,那么派生类中你不写函数体也可以通过编译,只不过用的是上一个基类的版本罢了。而纯虚析构函数
派生的类不写析构函数,那么就会用编译器生成的版本。区别就在这。
自己编了个小程序
懂了

蹲得越低,跳得越高.
2012-03-03 01:02
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
以下是引用lz1091914999在2012-3-2 16:02:20的发言:

不知道您的C++是中国哪位教授 传授的呢?

好像你是外国人教的一样,无语。这和教育没关系,我是实验之后才说的,不像你,信口开河误人子弟!
2012-03-03 10:13
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用CooperOne在2012-3-3 00:55:24的发言:

冤枉啊...你的编译器是什么?我用VC6.0的
我用的 g++。vc6 不是个很严格的 c++ 编译器,它只实现了 c++ 的部分功能。然后又另外加了很多微软自己的功能。


析构函数确实可以是虚函数。以下是 ISO/IEC 14882:1998(E) 第12段第4节 的相关内容:
12.4 Destructors

7 A destructor can be declared virtual or pure virtual; if any objects of that class or any derived class are created in the program, the destructor shall be defined. If a class has a base class with a virtual destructor, its destructor (whether user- or implicitly-declared) is virtual.
大意:
12.4 析构函数
7 析构函数可以被声明为虚函数或纯虚函数;如果在程序中创建该类对象或该类的派生对象,则应定义析构函数。如果一个类的基类有虚析构函数,则它的析构函数(无论是用户定义还是隐式声明)也是虚函数。

[ 本帖最后由 pangding 于 2012-3-3 11:55 编辑 ]
2012-03-03 11:50
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用lucky563591在2012-3-3 10:13:48的发言:

 
好像你是外国人教的一样,无语。这和教育没关系,我是实验之后才说的,不像你,信口开河误人子弟!

实践出真知是有道理,但 lz1091914999 也不一定就是信口开河。至少就实际情况来说他是对的。

lz1091914999 答完之后,rjsp 版主也给了肯定的意见。你实验之后,大家普遍对你的结果持反对态度。
我倒不是说版主就有多高的水平,但三人成虎。如果你严谨的话,是不是也应该换个编译器多做几个实验?或者至少是再去网上查阅一下相关的资料?

[ 本帖最后由 pangding 于 2012-3-3 12:04 编辑 ]
2012-03-03 12:02
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
以下是引用pangding在2012-3-3 12:02:52的发言:


实践出真知是有道理,但 lz1091914999 也不一定就是信口开河。至少就实际情况来说他是对的。

lz1091914999 答完之后,rjsp 版主也给了肯定的意见。你实验之后,大家普遍对你的结果持反对态度。
我倒不是说版主就有多高的水平,但三人成虎。如果你严谨的话,是不是也应该换个编译器多做几个实验?或者至少是再去网上查阅一下相关的资料?
这话比较中肯

蹲得越低,跳得越高.
2012-03-03 14:12
快速回复:析构函数为什么不能声明为纯虚函数的形式?
数据加载中...
 
   



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

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