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

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
...全文
1826 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都正确
内容概要:本文围绕“基于共享储能服务的智能楼宇双层优化配置”展开研究,提出了一种结合上层共享储能配置优化与下层楼宇内部能源调度优化的双层协同模型,通过Matlab代码实现,旨在提升智能楼宇在复杂能源环境下的运行效率与经济性。研究充分考虑光伏出力、负荷需求等不确定性因素,引入多维核密度估计、场景生成与削减等技术进行不确定性建模,并融合需求响应、微电网调度等先进理念,实现了对综合能源系统中储能资源的高效配置与动态调控,具有较强的理论深度与工程应用价值。; 适合人群:具备电力系统、可再生能源、优化算法或综合能源系统等相关背景,从事科研、工程应用或课题研究的研发人员、研究生及高年级本科生。; 使用场景及目标:①应用于智能楼宇、园区微电网、虚拟电厂等场景中的储能规划与运行优化;②支撑高水平学术论文(如EI/SCI)的复现、课题申报、毕业设计及实际项目的双层优化建模与求解实践。; 阅读建议:建议结合提供的Matlab代码进行实操演练,重点理解双层优化架构的设计逻辑、求解策略(如Benders分解、主从博弈等)及不确定性处理方法,同时可参考文中关联技术(如场景生成、需求响应)拓展研究思路与应用场景。

65,211

社区成员

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

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