您的位置:首页 > 其它

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

2016-07-20 20:52 786 查看
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照;
如果打开速度慢,可以尝试快速版;如果想更新或删除快照,可以投诉快照

百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

首页 精选版块
移动开发iOS Android Qt WP云计算IaaS Pass/SaaS 分布式计算/HadoopJava技术Java SE Java Web 开发 Java EE Java其他相关.NET技术.NET Framework C# .NET分析与设计 ASP .NET VB .NETWeb开发PHP JavaScript ASP HTML(CSS) HTML5 Apache开发语言/框架Delphi VC/MFC VB C/C++ Builder 其他开发语言数据库开发MS-SQL Server Oracle PowerBuilder Informatica 其他数据库开发硬件/嵌入式开发嵌入开发(WinCE) 驱动开发/核心开发 硬件设计 单片机/工控 汇编语言 VxWorks开发Linux/Unix社区系统维护与使用区 应用程序开发区 内核源代码研究区 驱动程序开发区 CPU和硬件区
论坛帮助 论坛牛人 论坛地图 专家问答

CSDN > CSDN论坛 > C/C++ > C++习题15.25,派生类对基类虚函数重新定义的问题。 [问题点数:20分,结帖人interim2012]
快速回复 只显示楼主 关注帖子

Primer》第4版

收藏



关注interim2012interim2012 本版等级:


本版专家分:175

结帖率:92.96%
楼主 发表于: 2012-03-23 19: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

这两个正确吗?

更多

分享到:

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

回复次数:8





关注

getmonyinfo

getmonyinfo

本版等级:


本版专家分:117

结帖率:66.67%

#1
得分:0

回复于:
2012-03-23 19:43:18

再好好看看书吧!

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

lanfeng_10

lanfeng_10

本版等级:


本版专家分:1599

结帖率:87.5%

#2
得分:10

回复于:
2012-03-23 19:51:06

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

这句话本来就有问题···

派生类的返回类型也可以是派生类的对象

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

lanfeng_10

lanfeng_10

本版等级:


本版专家分:1599

结帖率:87.5%

#3
得分:0

回复于:
2012-03-23 19:54:13

如果你在看primer ,建议把p477再看一下···引用 2 楼 lanfeng_10 的回复:
“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

这句话本来就有问题···

派生类的返回类型也可以是派生类的对象


对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

lanfeng_10

lanfeng_10

本版等级:


本版专家分:1599

结帖率:87.5%

#4
得分:0

回复于:
2012-03-23 19:57:42

修正下,应该是可以返回派生类对象的引用或指针
引用 2 楼 lanfeng_10 的回复:
“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”

这句话本来就有问题···

派生类的返回类型也可以是派生类的对象


对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

qscool1987

qscool1987

本版等级:


本版专家分:5309

结帖率:99.15%

#5
得分:10

回复于:
2012-03-23 20:28:36

这几个问题还狠有点意思,错误的应该是a,d

a就不说了

b是可以的,这是个特殊情况,C++

d是错误的,有const和没const是两个不同的函数,这里是有问题的,具体给你个链接

http://topic.csdn.net/u/20120303/12/a963851e-a151-4a81-9812-bb52d1942f83.html

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

Roy_Smiling

Roy_Smiling

本版等级:


本版专家分:1181

结帖率:89.8%

#6
得分:0

回复于:
2012-03-23 20:34:40

该回复于2012-03-26 08:55:34被版主删除

管理





关注

whdugh

whdugh

本版等级:


本版专家分:66

结帖率:91.12%

#7
得分:0

回复于:
2013-09-08 14:58:31

引用 5 楼 qscool1987 的回复:
这几个问题还狠有点意思,错误的应该是a,d

a就不说了

b是可以的,这是个特殊情况,C++

d是错误的,有const和没const是两个不同的函数,这里是有问题的,具体给你个链接

http://topic.csdn.net/u/20120303/12/a963851e-a151-4a81-9812-bb52d1942f83.html


想问一下 effective c++第几个条款有提到静态绑定了

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理





关注

wangliuyuedey...

wangliuyuedeyu123

本版等级:


本版专家分:0

结帖率:0%

#8
得分:0

回复于:
2014-08-24 18:01:09

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;

}

对我有用[0]
丢个板砖[0]
引用 |
举报 |

管理

返回列表


管理菜单



结帖


发帖


回复


关注

【社区问答】构建分布式服务化系统

知识库-大型网站架构

问答3月活动开始啦

2016年上半年热门下载资源



本帖子已过去太久远了,不再提供回复功能。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: