私はこれよりもはるかに複雑なクラス構造を持っていますが、その本質にまで問題を沸騰、これは私のシナリオを説明します。私は2つのクラス、& Bを持って、その純粋仮想基底クラスを実装その共通の祖先を、そして純粋仮想ベースで一般的な方法で充填& B.最後に、テンプレートクラスをCOM-断定第3クラスC:あいまいな継承:
struct I {
virtual void r()=0;
};
struct A : I {};
struct B : I {};
struct C : A, B {
void q(){
r(); // the problem is here.
}
};
struct D : C {
virtual void r(){
}
};
C* c = new D;
c->q();
私の問題は、私ができる、ありますr ::を呼び出すためにC :: qを得る方法はありません。
void C::q(){
r(); // is ambiguous
A::r(); // is pure virtual
B::r(); // also is pure virtual
D::r(); // C doesn't know about D
((D*)this)->r(); // is dubious and requires C to know about D.
}
正しい仮想メソッドが呼び出されるように、Cからr()メソッドを呼び出すにはどうすればよいですか?
申し訳ありませんが、ここでは仮想継承を使用できないことを明確にする必要があります。どちらも、すべてが解決するために十分に()Rへの呼び出しを明確に見える
struct C : A, B {
virtual void r()=0;
...
OR
struct C : A, B {
using A::r;
...
:私は2つの解決策を発見しました。
はCで
+1あなたの問題を解決し、最も簡単な形式に分解してください。 –
r()は仮想継承なしでCであいまいにならないでしょうか? – DumbCoder
仮想基本クラスか抽象基本クラスのみを意味しましたか?'I'を仮想ベースにするためには' struct A:virtual I {}; 'と' struct B:virtual I {}; 'が必要です。 –