谭浩强c++书上的一个错误,关于纯虚函数的

WuYL7812 2010-03-31 06:08:52
12.4
纯虚函数与抽象类
12.4.1
纯虚函数
这个章节里有下面描述,标为红色部分是错误的,大家发现了没有

注意:
①纯虚函数没有函数体
②最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
③这是一个声明语句,最后应有分号。

纯虚函数只有函数的名字而不具备函数的功能,不能被调用。
...全文
238 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuYL7812 2010-04-01
  • 打赏
  • 举报
回复
虚函数为什么我知道,但是这个地方他说的的却错了。


[Quote=引用 15 楼 sunm42000 的回复:]
虚函数是为了什么 lz搞明白这就行了
中文本来就是翻译过来的意会就可以 书中无非是强调在继承类中给予定义这点
英文够好可以看原本书籍 自己体会意思
[/Quote]
sunm42000 2010-03-31
  • 打赏
  • 举报
回复
实在不行lz可以直接看bjarne的c++程序设计语言这本书
sunm42000 2010-03-31
  • 打赏
  • 举报
回复
虚函数是为了什么 lz搞明白这就行了
中文本来就是翻译过来的意会就可以 书中无非是强调在继承类中给予定义这点
英文够好可以看原本书籍 自己体会意思
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
我看过国内几本C++的书,都写纯虚函数不能有函数体,明显错误了,实际上C++标准上没有规定纯虚函数不能有函数体
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
确实纯虚函数很少有定义,实际上是没必要有定义,表达成 纯虚函数没有函数体 是应该是错误的
我看过一本有名的书,书名我忘了,好像是essential c++,说有时候要用到这个技巧,就是应该定义纯虚函数
本来这个函数应该是普通虚函数的,通常可以被各个派生类使用,但是也有个别地方,必须自己定义,否则会有严重后果。但是程序员经常让编译器检查程序对还是错,普通虚函数有定义,编译不会出错
这是可以把这个函数定义成纯虚函数,这样没有定义就会编译出错,如果需要这个定义,只要用 :: 指定调用就可以了
jackyjkchen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dubiousway 的回复:]
纯虚函数定义函数体,其最大的作用是什么?(只是问问,我一直没搞明一个接口要定义干吗?有什么便利的地方吗)
[/Quote]
定义一个空类,又想这个空类作为虚基类的时候……这时候没地方定义虚函数,只能拿析构函数开刀……
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
虚函数当然可以是纯虚的,这个是语法问题,就是不让这个类被实例化。
实际上任意纯虚函数都可以有函数体,只要你愿意,而且可以被调用到。这个你可以那任意编译器试

[Quote=引用 9 楼 dubiousway 的回复:]
纯虚函数定义函数体,其最大的作用是什么?(只是问问,我一直没搞明一个接口要定义干吗?有什么便利的地方吗)
[/Quote]
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
是你理解有问题吧,我说过给 virtual ~base() = 0 加个定义,链接就能通过,结果也可以被调用
这个跟他书上说的有矛盾,但是我这个是编译器做出的判断。
在派生类中没法定义基类的析构函数,只能在基类中定义,即使这个函数是纯虚函数

[Quote=引用 6 楼 jackyjkchen 的回复:]
引用 2 楼 wuyl7812 的回复:
class base
{
public:
virtual ~base() = 0;
};

class derived : public base
{
public:
~dervied(){}
}

derived dd;

int main()
{
return 0;
}

编译不通过


我感觉这是你理解的……
[/Quote]
dubiousway 2010-03-31
  • 打赏
  • 举报
回复

纯虚函数定义函数体,其最大的作用是什么?(只是问问,我一直没搞明一个接口要定义干吗?有什么便利的地方吗)
jackyjkchen 2010-03-31
  • 打赏
  • 举报
回复
我看错了,原来是纯虚析构函数,这时候是要提供一个定义体
xiuxianshen 2010-03-31
  • 打赏
  • 举报
回复
貌似3楼发过,去问3楼要
jackyjkchen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyl7812 的回复:]
class base
{
public:
virtual ~base() = 0;
};

class derived : public base
{
public:
~dervied(){}
}

derived dd;

int main()
{
return 0;
}

编译不通过
[/Quote]

我感觉这是你理解的问题啊,你继承中没有实例化纯虚函数当然不行了。

虚函数本身是不能实例化的(不能定义实现),但是用时必须在子类实现后用
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
哪里有这个勘误表,我要看完谭浩强这本书,要找出其错误,考验一下我的c++概念
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
~base()是必须要定义的,因为这个是必然要调用到的,给~base()加个定义就编译通过了
实际上是纯虚函数一般都没必要有定义,但是你要是给纯虚函数写的定义,编译器也不会报错,而且可以调用到,用过 :: 运算符指定要调用基类的函数
jackyjkchen 2010-03-31
  • 打赏
  • 举报
回复
谭浩强里的书许多地方用词不规范

①纯虚函数没有函数体;

的意思应该是是说纯虚函数没有定义实现。

实际上,这正原则性的“正反”错误倒真不很多,网上流传的那份给谭浩强的勘误表,抠字眼的本事倒是一流,看完以后我没有鄙视谭浩强,倒鄙视那篇文章的作者
WuYL7812 2010-03-31
  • 打赏
  • 举报
回复
class base
{
public:
virtual ~base() = 0;
};

class derived : public base
{
public:
~dervied(){}
}

derived dd;

int main()
{
return 0;
}

编译不通过
SiGoYi 2010-03-31
  • 打赏
  • 举报
回复
LZ连他的书还看啊!我上学时让他误了我的学生时代。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧