注册 登录
编程论坛 C++教室

析构函数为什么不能声明为纯虚函数的形式?

CooperOne 发布于 2012-03-01 13:22, 5372 次点击
如题

virtual ~Node(){};能通过编译
virtual ~Node()=0;不能通过编译


求解
21 回复
#2
lz10919149992012-03-01 15:31
可以,但是也要给出定义。
#3
rjsp2012-03-02 08:16
顶楼上
#4
lucky5635912012-03-02 08:23
不能声明为纯虚函数,2L纯粹乱说。继承的时候要先构造父类,析构时只能调用子类的析构,父类不能被删除。
#5
BianChengNan2012-03-02 09:42
以下是引用lucky563591在2012-3-2 08:23:17的发言:

不能声明为纯虚函数,2L纯粹乱说。继承的时候要先构造父类,析构时只能调用子类的析构,父类不能被删除。
这个真的不可以吗?怎么我了解到的是可以的呢?在Effective C++中有说到,如果有什么依据请指出来,多谢。
#6
CooperOne2012-03-02 15:09
回复 2楼 lz1091914999
它都纯虚函数了...怎么个定义法啊?...
#7
BianChengNan2012-03-02 15:27
以下是引用CooperOne在2012-3-2 15:09:57的发言:

它都纯虚函数了...怎么个定义法啊?...
这个就要多看看ec thinking in c++ 等书了
#8
lz10919149992012-03-02 15:59
想想,构造和析构函数都有着特别的意义,这是与其它函数不同的,并且在一个类层次中析构函数都会被调用,那么如果一个类没有析构函数的定义,那么调用那一块代码呢?
但是如果需要一个函数体,那又怎么称得上是“纯”?它的唯一价值就是让这个类成为抽象类,所以不能创建这个类的对象,当然让其它成员函数成为纯的效果也一样。
但是继承一个有纯虚析构函数的类的时候,在派生类中可以不给出析构函数的定义,并且这个类也不是抽象类,这是与其它函数不同的地方(其它纯虚函数没有给出定义的话,这个类也是抽象类)。因为编译器自动帮我们生成了一个定义,所以也可以认为重写了父类的纯虚函数。所以你明白为什么编译器和链接器强迫我们为它提供一个函数体了嘛?
#9
lz10919149992012-03-02 16:02
回复 4楼 lucky563591
不知道您的C++是中国哪位教授 传授的呢?
#10
pangding2012-03-02 18:22
额……我觉得楼主这个问题有陷阱的性质……
#11
CooperOne2012-03-02 20:38
以下是引用lz1091914999在2012-3-2 15:59:54的发言:

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

额……我觉得楼主这个问题有陷阱的性质……
此话怎讲
#13
pangding2012-03-02 21:45
明明后者能通过编译,你非问为什么不能。回答的人还不是容易先入为主,然后百般解释为什么不能。

我先汗一把,要不是人 2楼 回答的快,我估计也得像4楼一样乱扯一通。
#14
lz10919149992012-03-02 21:48
回复 11楼 CooperOne
主要目的是让基类不能创建对象。想想,如果你的析构函数只是虚函数,那么派生类中你不写函数体也可以通过编译,只不过用的是上一个基类的版本罢了。而纯虚析构函数
派生的类不写析构函数,那么就会用编译器生成的版本。区别就在这。
#15
CooperOne2012-03-03 00:55
以下是引用pangding在2012-3-2 21:45:34的发言:

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

我先汗一把,要不是人 2楼 回答的快,我估计也得像4楼一样乱扯一通。
冤枉啊...你的编译器是什么?我用VC6.0的
#16
CooperOne2012-03-03 01:02
以下是引用lz1091914999在2012-3-2 21:48:54的发言:

主要目的是让基类不能创建对象。想想,如果你的析构函数只是虚函数,那么派生类中你不写函数体也可以通过编译,只不过用的是上一个基类的版本罢了。而纯虚析构函数
派生的类不写析构函数,那么就会用编译器生成的版本。区别就在这。
自己编了个小程序
懂了
#17
lucky5635912012-03-03 10:13
以下是引用lz1091914999在2012-3-2 16:02:20的发言:

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

好像你是外国人教的一样,无语。这和教育没关系,我是实验之后才说的,不像你,信口开河误人子弟!
#18
pangding2012-03-03 11:50
以下是引用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 编辑 ]
#19
pangding2012-03-03 12:02
以下是引用lucky563591在2012-3-3 10:13:48的发言:

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

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

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

[ 本帖最后由 pangding 于 2012-3-3 12:04 编辑 ]
#20
CooperOne2012-03-03 14:12
以下是引用pangding在2012-3-3 12:02:52的发言:


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

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

我用的 g++。vc6 不是个很严格的 c++ 编译器,它只实现了 c++ 的部分功能。然后又另外加了很多微软自己的功能。


析构函数确实可以是虚函数。以下是 ISO/IEC 14882:1998(E) 第12段第4节 的相关内容:大意:
12.4 析构函数
7 析构函数可以被声明为虚函数或纯虚函数;如果在程序中创建该类对象或该类的派生对象,则应定义析构函数。如果一个类的基类有虚析构函数,则它的析构函数(无论是用户定义还是隐式声明)也是虚函数。
按照定义的话...析构函数是可以被声明为纯虚函数
但是是否能定义呢?
假如能的话
那纯虚函数岂不是没啥意义了?
假如不能的话........好像也没什么大不了的


PS:大家要和谐啊!破坏民族团结的罪名我可担当不起吖~
#22
李亚宽2012-03-04 12:24
恩 我也有楼上的问题 、
1