-4

有人可以解释每行输入背后的原因吗?

Class A {
bool f(A* a) { return true; }
}
class B : public A {
bool f(B* b) { return false; }
}
void f() {
A* a = new A();
A* ab = new B();
B* b = new B();
a->f(a); a->f(ab); a->f(b); // true, true, true
ab->f(a); ab->f(ab); ab->f(b); // true, true, true
b->f(a); b->f(ab); b->f(b); // error, error, false
}
4

1 回答 1

1

B有两个同名的非虚方法:bool f(A*)bool f(B*).

通常,这些将是重载;但由于一个是从基类继承的,所以它被后者隐藏了。它仍然可以访问,它只需要一些特殊的语法来调用它,例如:

B b;
B* param;
b.f(param);    // calls B::f(B*)
b.B::f(param); // same
b.A::f(param); // calls the hidden A::f(A*)

所以:

a->f(a); a->f(ab); a->f(b);

这个很简单:a是 type A*,所以A::f(A*)会被调用并且 type 的参数B*会被转换为A*

ab->f(a); ab->f(ab); ab->f(b);

同样的事情发生,因为ab也是 type A*

b->f(a); b->f(ab);

这些不能工作,因为bis 类型B*并且b->f只能引用B::f(B*)( A::fis hidden)。您不能隐式转换 fromA*B*.

不过,您可以明确提及 hidden 方法:

b->A::f(a); b->A::f(ab);

最后一个作品,只需调用B::f(B*)

b->f(b);

ideone 样品


评论:

在这里,函数是否是虚拟的并不重要。它们有不同的参数类型,所以不能覆盖另一个。一个只能隐藏另一个。

C++ 允许协变返回类型(如果 args 匹配,您可能希望有virtual A* foo()inAvirtual B* foo()in )。B但是, C++ 不允许协变或逆变参数类型。

于 2013-02-22T12:57:31.557 回答