一个老的趋势笔试题,求正解

citywanderer2005 2006-10-23 12:20:47
1.8 Which virtual function redeclarations of the Derived class are correct?
a. Base* Base::copy(Base*);
Base* Derived::copy(Derived*);
b. Base* Base::copy(Base*);
Derived* Derived::copy(Base*);
c. ostream& Base::print(int,ostream&=cout);
ostream& Derived::print(int,ostream&);
d. void Base::eval() const;
void Derived::eval();
-----------------------
我的测试程序:
#include <iostream>
using namespace std;

class Base
{
public:
virtual Base* diffArgument(Base* temp)
{
cout<< "base.diffArgument\n";
return NULL;
}

virtual Base* diffReturn(Base* temp)
{
cout<< "base.diffReturn\n";
return NULL;
}

virtual ostream& print(int temp,ostream& out=cout)
{
cout<< "base.print\n";
return out;
}

virtual void eval() const
{
cout<< "base.eval\n";
}

};

class Derived:public Base
{
public:
Base* diffArgument(Derived* temp)
{
cout<< "Derived.diffArgument\n";
return NULL;
}

Derived* diffReturn(Base* temp)
{
cout<< "Derived.diffReturn\n";
return NULL;
}

ostream& print(int temp,ostream& out)
{
cout<< "Derived.print\n";
return out;
}

//not overwrite
void eval()
{
cout<< "Derived.eval\n";
}
};
int main(void)
{
Base* p = new Derived();
p->diffArgument(p);
p->diffReturn(p);
p->print(0, cout);
p->eval();
return 0;
}

结果是b、c都对,疑惑之
base.diffArgument
Derived.diffReturn
Derived.print
base.eval
...全文
1783 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
enderjiang 2006-10-25
  • 打赏
  • 举报
回复
mark

mekiss 2006-10-24
  • 打赏
  • 举报
回复
看过
Kusk 2006-10-23
  • 打赏
  • 举报
回复
有意思,第一次看到啊。不是很了解,讨论讨论。

b. 是不是因为Derived与Base满足is-a关系,所以这样是可以的?
c. 默认参数声明不同而已,应该不会影响吧。
突击召唤师 2006-10-23
  • 打赏
  • 举报
回复
学习。不过实际项目中应该不会出现这样的应用吧,简直是找死。
rickerliang 2006-10-23
  • 打赏
  • 举报
回复
这个问题又来了
csShooter 2006-10-23
  • 打赏
  • 举报
回复
学习
飞哥 2006-10-23
  • 打赏
  • 举报
回复
路过,看了楼上的链接

---------------

JF
lvbdj 2006-10-23
  • 打赏
  • 举报
回复
只有B
lw1a2 2006-10-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5082/5082716.xml?temp=.5393946
lw1a2 2006-10-23
  • 打赏
  • 举报
回复
几天前见过一次
iambic 2006-10-23
  • 打赏
  • 举报
回复
呵呵,那张贴子里面,B和C还是稍微有些争论的。我支持单选B,双选BC。
但B的特性并不是虚函数一出现时就有的。如果这道题目老到此特性出现之前,那就毫无疑问的选C了。
weijiangshanwww 2006-10-23
  • 打赏
  • 举报
回复
正解:

首先应该明确的是这题在考我们override重写而不是overload重载
对于重写参数列表必须相同,而他们的返回类型不必相同,但是必须符合一条原则:
子类函数的返回类型必须可以进行切割转变为父类函数的返回类型,否则不能达到virtual的效果
值得一提的是第一个选项 本来觉得也可以通过类似切割的技术把Derived对象转变为Base对象,但是实验发现似乎不能实现多态

Base *b = Derived();
Derived* d;
b.func(d);
调用不到子类的func函数
那么归纳为这种继承要保持函数签名的参数列表的一致才能实现多态
但是虽然C选项可以实现这样的print(3,cout)但是子类是不能这样使用的print(3),所以也不能算是多态
只有B才能多态
OOPhaisky 2006-10-23
  • 打赏
  • 举报
回复
c. ostream& Base::print(int,ostream&=cout);
ostream& Derived::print(int,ostream&);
之所以正确,因为缺省参数不是函数签名的一部分,即加上缺省参数与否不影响函数签名,所以此处基类与子类的print函数签名是相同的。
OOPhaisky 2006-10-23
  • 打赏
  • 举报
回复
b. Base* Base::copy(Base*);
Derived* Derived::copy(Base*);
之所以正确,是因为C++允许派生类中重写的虚拟函数的返回类型是基类函数返回类型的子类,这是一个特例,方便实现clone函数。
OOPhaisky 2006-10-23
  • 打赏
  • 举报
回复
b和c都正确

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧