B
同じ名前の2つの非仮想メソッドがあります:bool f(A*)
とbool f(B*)
。
通常、これらは過負荷になります。しかし、1つは基本クラスから継承されているため、基本クラスによって隠されています。それはまだアクセス可能です、それを呼び出すためにいくつかの特別な構文が必要です、例えば:
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
は型なA*
ので、A::f(A*)
呼び出され、型の引数はB*
に変換されA*
ます。
ab->f(a); ab->f(ab); ab->f(b);
ab
もタイプなので、同じことが起こりA*
ます。
b->f(a); b->f(ab);
b
はタイプB*
であり、b->f
参照のみB::f(B*)
(非表示)であるため、これらは機能しませんA::f
。A*
からを暗黙的に変換することはできませんB*
。
ただし、非表示のメソッドについては明示的に言及できます。
b-> A :: f(a); b-> A :: f(ab);
そして最後の作品は、単に呼び出すだけですB::f(B*)
:
b->f(b);
ideoneでのサンプル
備考:
ここでは、関数が仮想であるかどうかは関係ありません。それらは異なる引数タイプを持っているので、一方が他方をオーバーライドすることはできません。一方は他方を隠すことしかできません。
C ++では、共変の戻り型を使用できます(引数が一致する場合は、virtual A* foo()
inA
とvirtual B* foo()
inが必要になる場合があります)。B
ただし、 C++では共変または反変の引数型は許可されていません。