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();
似乎正确的答案是'C',但我不确定为什么。有人知道原因吗?
编辑:
那就是正确实现了多态性?
答案 0 :(得分:1)
选项A是隐藏原因Base::copy
,而Derived::copy
采用不同类型的参数。并且使用选项D,Base 1是const
,其中Derived one是non-const
,两者都没有相同的cv-qualifier。和选项C使用相同的签名。所以c是适当的覆盖。
选项C更改重写函数的默认参数。在http://www.gotw.ca/gotw/005.htm中提及bad-practice
should-not
但legal C++
也是正确的,如@Als指出
修改:假设问题中未提及virtual
关键字
更正选项A应该是
Base* Base::copy(Base*);
Base* Derived::copy(Base*);
更正选项D应该是
void Base::eval() const;
void Derived::eval() const;
或
void Base::eval();
void Derived::eval();
答案 1 :(得分:1)
4个选项中没有一个覆盖基类功能
根据C ++标准,重叠需要virtual
关键字。
基本上,它们中的所有4个都是隐藏同一命名函数的基类实现。
这是功能隐藏 不 功能覆盖。
好读:
<强> What's the meaning of, Warning: Derived::f(char)
hides Base::f(double)
? 强>
编辑:
假设存在virtual
关键字,答案是:
B
请注意 C 是合法,但不正确&amp; OP要求正确的多态性实现所以,
C: 不符合正确的条件。
覆盖函数应该与它覆盖的函数具有相同的原型,请注意,覆盖函数允许 co-variant return types 。
应用此规则,
A:
被取消资格,因为它将不同的参数作为函数参数
由于您覆盖了 should not change the default arguments 的功能,C:
会被取消资格
D:
被取消资格,因为函数前const
与没有const
的函数不同。