《C++Primer》第4版 习题15.25,派生类对基类虚函数重新定义的问题。

interim2012 2012-03-23 07:18:37
“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

上面这句话我是在网上搜到的。


假定Derived继承Base,并且Base将下面的函数定义为虚函数,假定Derived打算定义自己的这个虚函数的版本,确定在Derived中哪个声明是错误的,并指出为什么错。
(a) Base* Base::copy( Base* );
Base* Derived::copy( Derived* );
(b) Base* Base::copy( Base* 0;
Derived* Derived::copy( Base* );
(c) Ostream& Base::print( int, ostream& = cout );
ostream& Derived::print( int, ostream& );
(d) void Base::eval() const;
void Derived::eval();

习题15.25的答案:
错误的是
a

请问b 返回类型不同
d 多了个const
这两个正确吗?
...全文
525 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_thinker 2014-08-24
  • 打赏
  • 举报
回复
C++ PRIMER p502 AND P477 15.25D选项。问题:在基类中定义一个虚函数virtual int foo()const, 而在派生类中定义一个函数是int foo().要实现动态绑定,问是否有错。 #include <iostream> #include <string> using namespace std; class Base { public: virtual int foo() const { return 3; } }; class Derive:public Base { public: int foo() { return 4; } }; int main() { Base base; Derive derive; Base *p=&base; cout<<p->foo()<<endl; p=&derive; cout<<p->foo()<<endl; Derive *pb=&derive; cout<<pb->foo()<<endl; system("pause"); return 0; } 为什么会出现这个结果呢?因为一个函数用const声明和不用const声明是不一样的,不会重复定义,也就是说:如果在一个作用域中定义了两个函数 int foo()const { return 2; } int foo() { return 3; } 这两个函数是不会造成重定义的,它们是不同的函数。 因此派生类中的foo()并不是继承自基类的虚函数,而是把基类的虚函数给屏蔽了。P477说:如果派生类中没有重定义某个虚函数,则使用基类的版本,因此第二个动态绑定调用的是基类的虚函数版本。 因此可以这样引申:在派生类中重新定义基类中的虚函数就OK. #include <iostream> #include <string> using namespace std; class Base { public: virtual int foo() const//基类的虚函数 { return 3; } }; class Derive:public Base { public: int foo()const//重定义基类的虚函数 { return 5; } int foo()//和上面的虚函数构成重载 { return 4; } }; int main() { Base base; Derive derive; Base *p=&base; cout<<p->foo()<<endl; p=&derive; cout<<p->foo()<<endl; Derive *pb=&derive; cout<<pb->foo()<<endl;//输出4是因为调用foo的对象不是const的。 system("pause"); return 0; }
whdugh 2013-09-08
  • 打赏
  • 举报
回复
引用 5 楼 qscool1987 的回复:
这几个问题还狠有点意思,错误的应该是a,d a就不说了 b是可以的,这是个特殊情况,C++只允许返回值为该类的指针和引用这种情况 c也是可以的,默认参数是静态绑定的,这个具体得参考下effective C++ d是错误的,有const和没const是两个不同的函数,这里是有问题的,具体给你个链接 http://topic.csdn.net/u/20120303/12/a963851e-a151-4a81-9812-bb52d1942f83.html
想问一下 effective c++第几个条款有提到静态绑定了
qscool1987 2012-03-23
  • 打赏
  • 举报
回复
这几个问题还狠有点意思,错误的应该是a,d
a就不说了
b是可以的,这是个特殊情况,C++只允许返回值为该类的指针和引用这种情况
c也是可以的,默认参数是静态绑定的,这个具体得参考下effective C++
d是错误的,有const和没const是两个不同的函数,这里是有问题的,具体给你个链接
http://topic.csdn.net/u/20120303/12/a963851e-a151-4a81-9812-bb52d1942f83.html
蓝枫10 2012-03-23
  • 打赏
  • 举报
回复
修正下,应该是可以返回派生类对象的引用或指针
[Quote=引用 2 楼 lanfeng_10 的回复:]

“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象
[/Quote]
蓝枫10 2012-03-23
  • 打赏
  • 举报
回复
如果你在看C++ primer ,建议把p477再看一下···[Quote=引用 2 楼 lanfeng_10 的回复:]

“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象
[/Quote]
蓝枫10 2012-03-23
  • 打赏
  • 举报
回复
“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象
getmonyinfo 2012-03-23
  • 打赏
  • 举报
回复
再好好看看书吧!

64,701

社区成员

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

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