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);
这些不能工作,因为b
is 类型B*
并且b->f
只能引用B::f(B*)
( A::f
is hidden)。您不能隐式转换 fromA*
到B*
.
不过,您可以明确提及 hidden 方法:
b->A::f(a); b->A::f(ab);
最后一个作品,只需调用B::f(B*)
:
b->f(b);
ideone 样品
评论:
在这里,函数是否是虚拟的并不重要。它们有不同的参数类型,所以不能覆盖另一个。一个只能隐藏另一个。
C++ 允许协变返回类型(如果 args 匹配,您可能希望有virtual A* foo()
inA
和virtual B* foo()
in )。B
但是, C++ 不允许协变或逆变参数类型。