2017-09-22 4 views
3
class A { }; 
class B : public A {}; 
class C : public A, public B {}; 

int main() 
{ 
    C c; 
    A *pA = static_cast<A *>(&c); 
} 

にアップキャスト、クラスCは、2回の異なるパスでクラスAから誘導される:直接 1。私はクラスAへのポインタにクラスCのオブジェクトをキャストするときので< -B < -C(仮想継承を使用せずに)、複数の方法でベース・クラスであるC++クラス上記のコードで

すなわちBを介して間接的に 2から、G ++ Linux上では、次のエラーを報告: エラー:AがありますCのあいまいな基盤

私は同じコードをt彼は以下のように静的にキャストします: A * pA =&c; しかし、私はまだまったく同じエラーが発生します。

解決方法はありますか?ところで、Visual C++コンパイラを使用してWindows上でエラーなく正常に動作します。

私は仮想継承がこれを解決していることは知っていますが、仮想継承を使用せずにLinux上でg ++でこの作業を行うための解決策が必要です。仮想継承を使用する代わりに、2つのパスのどちらかを指定してあいまいさを取り除くことができます。どうもありがとう!

+1

まず、継承ツリーはコードの匂いです。第二に、あなたが探しているものは仮想継承です。それを見てください;) – YSC

+0

'C 'に' A'の継承されたインスタンスが2つ必要な理由を詳しく教えてください。構成はオプションですか? –

+1

@YSC - いいえ、**デザイン**を変更することは、**コーディング**問題の解決策ではありません。同じタイプの** 2つの**ベースを持つことは不合理ではなく、それらを管理する方法を尋ねることは不合理ではありません。 –

答えて

0

かいつまんで、Cの一部である二つの異なるAのを避けるためにA事実継承:今、あなたのコードがコンパイルされ、正常に動作し

class A { }; 
class B : virtual public A {}; 
class C : virtual public A, public B {}; 

を。

"通常の"基本クラスとは異なり、仮想基本クラスは、それがあるパスの数にかかわらず、一度だけ継承されます。それらの仕組みの詳細については、this Q&Aを参照してください。

+1

私はOPが実際に質問が策定された方法のために2つの別々の 'A'インスタンスが必要であると仮定しました。 –

+0

@ MarkB OPのクラスにメンバーがいないことを考えると、彼の意図は「C」に1つか2つの「A」があるのか​​どうかを知ることは難しいです。私には2つの「A」が必要なことは非常に珍しいので、私はOPが1つを望んでいると仮定しました。 – dasblinkenlight

4

あなたがCを変更することができた場合は、一つの可能​​なアプローチはそれとA間にダミー基本クラスを「注入」するために、次のようになります。

class A { }; 
class B : public A {}; 
class AlmostA : public A {}; 
class C : public AlmostA, public B {}; 

int main() 
{ 
    C c; 
    A *pA = static_cast<A*>(static_cast<AlmostA*>(&c)); 
} 

[Live example]

あなたもデュアル静的にキャスト埋め込むことができます機能はCです。

関連する問題