您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照;

如果打开速度慢,可以尝试快速版;如果想更新或删除快照,可以投诉快照

百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。
 
 
 
 
CSDN > CSDN论坛 > C/C++ > C++习题15.25,派生类对基类虚函数重新定义的问题。 [问题点数:20分,结帖人interim2012]

Primer》第4版 收藏

关注
interim2012
interim2012
本版等级:

本版专家分: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  
这两个正确吗?

更多

分享到:

 
 

回复次数:8

 
关注
getmonyinfo

getmonyinfo
本版等级:

本版专家分:117

结帖率:66.67%

#1
得分:0

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

再好好看看书吧!

关注
lanfeng_10

lanfeng_10
本版等级:

本版专家分:1599

结帖率:87.5%

#2
得分:10

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

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

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象

关注
lanfeng_10

lanfeng_10
本版等级:

本版专家分:1599

结帖率:87.5%

#3
得分:0

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

如果你在看primer ,建议把p477再看一下···引用 2 楼 lanfeng_10 的回复:

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

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象

关注
lanfeng_10

lanfeng_10
本版等级:

本版专家分:1599

结帖率:87.5%

#4
得分:0

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

修正下,应该是可以返回派生类对象的引用或指针
引用 2 楼 lanfeng_10 的回复:

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

这句话本来就有问题···
派生类的返回类型也可以是派生类的对象

关注
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

关注
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++第几个条款有提到静态绑定了

关注
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;
}

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

  1. java定义类 对象,引用,指针

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

  2. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  3. js函数定义参数个数和实际传入参数的对比

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  4. js中函数调用时,对参数个数和类型没有要求

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java一样对其传入参数的类型进行定,也对传入参数的个数没有要求. js函数的参数与大多数其他语 ...

  5. 写一方法来实现两个变量的交换。在主调函数中定义两个整型变量,并初始化,调用交换方法,实现这两个变量的交换。(使用ref参数)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. C++ 虚基类的定义、功能、规定

    原文声明:http://blog.sina.com.cn/s/blog_93b45b0f01011pkz.html 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然 ...

  7. C++中基类对象的引用

    代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: void pri ...

  8. c++学习笔记之基础---类内声明函数后在类外定义的一种方法

    在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类 ...

  9. C++ 类外定义

    类内定义与内联函数 像下面这种函数名与函数体都写在类里面的函数形式被称作类内定义,编译器编译的时候会把它默认成内联函数. class Student { public: void setAge(int ...

随机推荐

  1. zoj 3365 灵活数字规律

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3365 #include <cstdio> #incl ...

  2. IE chrome兼容问题

    1.关于display显示和隐藏问题 document.getElementById("id").style.display="";//表示显示 documen ...

  3. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)

    切分语句 软件project的一条定律是数据和代码分离.这样做会使代码更易于測试,即使输入的数据发生改变,你的代码也能够同意.甚至于,程序能在执行中实时下载新的数据.假设程序能在执行中下载新书岂不是更 ...

  4. jquery中修改一个元素的值或内容

    jquery中修改一个元素的值或内容,比如数值增加可以使用这个方法取得原值并+1 $this.text(function(i,ot){return Number(ot)+1;});

  5. [转] 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...

  6. jQuery代码优化 事件委托篇

    <转自 http://www.jb51.net/article/28770.htm> 参考文章:  解密jQuery事件核心 - 绑定设计(一) 参考文章:  解密jQuery事件核心 - ...

  7. Linux: FTP服务原理及vsfptd的安装、配置

    1.FTP 服务的安装# yum install -y vsftpd [root@rusky pub]# ls -l /etc/vsftpd/ total 20 -rw-------. 1 root ...

  8. Linux开发工具之gdb(下)

    三.gdb调试(下) 01.查看运行时数据 print - 查看变量值 ptype - 查看类型 print array - 查看数组 print *array@len - 查看动态内存 print ...

  9. 使用MWC四轴起飞侧翻解决方法

    原因如下:1.电机顺序错了,如上图所示,上面蓝色的箭头是机头,绿色的箭头是电机转向,3.10.11.9对应MWC飞控版上的D3,D9,D11,D9,蓝色箭头对应MWC飞控板的箭头 或者传感器的Y轴 以 ...

  10. jQuery中在当前页面弹出一个新的界面

    W.$.dialog({ content:'url:wswgrkbillController.do?snh&id='+b+'&bh='+c+'&ck='+d+'&sl= ...