您查询的关键词是: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. QQ空间自动发广告解决方法

    最近空间好多人QQ都中了毒.每天我都有几十个好友刷空间话费.流量广告! QQ空间自动发广告的原因: 最近使用了刷赞或者其他QQ外挂软件(有些开发者或破解者会在这样的软件上留后门,请自己判断). 或者最 ...

  2. 饭卡 (背包01 一维数组) http://acm.hdu.edu.cn/showproblem.php?pid=2546

    /* 从一组数据中选出n个数,使这n个数的和最接近一个值x, 背包问题, 从一系列菜中,从最贵的菜(MAX)之外中选出几个菜,使菜的总价格sum最接近money-5:money-sum-MAX; 钱数 ...

  3. jsp中的contentType与pageEncoding的区别和作用

    jsp中的contentType与pageEncoding的区别和作用   <%@ page contentType="text/html; charset=utf-8" p ...

  4. 约瑟夫问题(Josephus Problem)的两种快速递归算法

    博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...

  5. [PWA] 10. Trigger a version update

    When the refersh button is clicked, we need to tell the waiting service worker to replace the curren ...

  6. Meth | 安装Linux Mint 18以后grub2 win10启动引导项丢失??!!

    进入mint,打开终端输入:sudo update-grub2

  7. 网络环境场景以及模拟工具netem

    网络环境场景包括: 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况. 掉包(Drop),随机丢弃一些数据. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的 ...

  8. Block小结

    Blocks是C语言的扩充功能.用一句话来表示Blocks的扩充功能:带有自动变量(局部变量)的匿名函数. block其实是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++ ...

  9. Codeforces Round #291 (Div. 2) C - Watto and Mechanism 字符串

    [题意]给n个字符串组成的集合,然后有m个询问(0 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) ,每个询问都给出一个字符串s,问集合中是否存在一个字符串t,使得s和t长度相同,并且仅有一个 ...

  10. Angular JS API

    ng function angular.bind angular.bootstrap angular.copy angular.element angular.equals angular.exten ...