@BenVoigtがコメントで指摘しているように、以下の回答はg ++のバグが原因でのみ機能します(つまり、機能し続けることが保証されておらず、移植性がないことは間違いありません)。したがって、特定の(バギー)コンパイラを使用する場合は、必要なことを実行できますが、使用する必要のあるオプションではありません。
ただし、仮想継承を使用してください。
これは、質問のコードが暗示しているシナリオではありませんが、文
私の質問は、B :: foo()を明示的に呼び出さなくても、fooの実装がクラスBの実装であることをコンパイラに伝える方法があるということです。
::
修飾子を使用せずに、関数の複数の基本バージョンを区別するための構文を求めているようです。
using
これは、ディレクティブを使用して行うことができます。
#include <iostream>
class A {
public:
A(){}
virtual void foo(){std::cout<<"A func";}
};
class B: virtual public A {
public:
B(){}
virtual void foo(){std::cout<<"B func";}
};
class C:virtual public A, virtual public B {
public:
C(){}
using A::foo; // tells the compiler which version to use
// could also say using B::foo, though this is unnecessary
};
int main() {
C c;
c.foo(); // prints "A func"
return 0;
}
もちろん、他の回答が指摘しているように、質問のコード自体はこれをまったく必要としません。