标签:
|
楼主 发表于: 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 这两个正确吗? |
|
#1
得分:0
回复于:
2012-03-23 19:43:18
再好好看看书吧!
|
|
#2
得分:10
回复于:
2012-03-23 19:51:06
“基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同”
这句话本来就有问题··· 派生类的返回类型也可以是派生类的对象 |
|
#3
得分:0
回复于:
2012-03-23 19:54:13
如果你在看primer ,建议把p477再看一下···
|
|
#4
得分:0
回复于:
2012-03-23 19:57:42
修正下,应该是可以返回派生类对象的引用或指针
|
|
#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 |
|
#6
得分:0
回复于:
2012-03-23 20:34:40
|
管理
|
#7
得分:0
回复于:
2013-09-08 14:58:31
想问一下 effective c++第几个条款有提到静态绑定了
|
|
|
#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------> 可以返回派生类对象的引用或指针
标签:
原文地址:http://www.cnblogs.com/gaoxianzhi/p/5689681.html