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()inA和virtual B* foo()in )。B但是, C++ 不允许协变或逆变参数类型。