您查询的关键词是: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. winform timespan 两个时间的间隔(差) 分类: WinForm 2014-04-15 10:14 419人阅读 评论(0) 收藏

    TimeSpan 结构  表示一个时间间隔. 先举一个小例子:(计算两个日期相差的天数) 代码如下: DateTime dt = DateTime.Now.ToShortDateString(yyyy ...

  2. JVM调优之jstack找出发生死锁的线程

    1.执行死锁程序 2.执行 jstack -l 21733 | more 结果如下: 死锁程序: public static void main(String[] args) { // TODO Au ...

  3. FusionCharts的使用入门

    1. Fusioncharts 介绍: Fusioncharts是一个基于Flash的图表组件,可以用来提供数据驱动的动态图标,fusioncharts可用于任何网页脚本语言如, HTML格式,JSP ...

  4. HDU 2066-一个人的旅行(最短路Dijkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. POJ 2075 Tangled in Cables (c++/java)

    http://poj.org/problem?id=2075 题目大意: 给你一些人名,然后给你n条连接这些人名所拥有的房子的路,求用最小的代价求连接这些房子的花费是否满足要求. 思路: 昨天20分钟 ...

  6. [Angular 2] ng-class and Encapsulated Component Styles

    import {Input, Component, View, NgClass} from "angular2/angular2"; @Component({ selector: ...

  7. Linux下一个Redis启动/关闭/重新启动服务脚本

    脚本功能: 实现redis单机多实例情况下的正常启动.关闭.重新启动单个redis实例.完毕系统标准服务的下面经常使用功能:  start|stop|status|restart 注:redis程序代 ...

  8. 开发Mhealth(即:Mobile Health 移动医疗)应用必知的10个掘金点

    近 日,著名移动技术咨询公司Research2Guidance发布了最新版的<移动医疗应用开发者经济>报告.在过去的两年半里,iOS和Android 两大主流移动平台上的移动医疗应用(以下 ...

  9. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  10. php 二维数组转换成树状数组(转)

    <?php/** * @param array $list 要转换的结果集 * @param string $pid parent标记字段 * @param string $level leve ...