Derived类的哪些虚拟重新声明是正确的?

时间:2011-10-30 15:44:51

标签: c++

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',但我不确定为什么。有人知道原因吗?

编辑:

那就是正确实现了多态性?

2 个答案:

答案 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-notlegal C++

协变返回类型B的http://www.tolchz.net/?p=33

也是正确的,如@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的函数不同。