2011-01-05 12 views
1

C++で次の継承構造が正当でない理由は何ですか?同じクラスから派生したクラスから派生したC++サブクラス

  • SON1がFather1由来
  • Son2がFather1由来
  • GrandSon1はSON1とSon2由来

すべてのクラスがpure-ある場合、これは(おそらく正当なものである場合があることができればGrandSon1を除く仮想)、彼らは何で、どのように来るのですか?

+0

"正当なものではない"と正確にはどういう意味ですか? – Jon

+0

なぜ合法ではないのですか?参照:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8(25.8と25。9) – badgerr

+5

不正な 'Son' ==' Bastard'? –

答えて

7

あなたは間違っていますが、これはC++では完全に合法です。あなたはvirtual inheritanceに見えるかもしれません。

3

この継承階層がdiamond of deathと呼ばれ、あなたが仮想継承を使用している場合、それはまだ通常は問題だが、それは、C++で法的です。

+0

この回答はC++でのプログラミングを危険なものにしています。 –

+3

@Space:C++ *はすごく危険です。 –

-2

あなたはクラス階層とクラスインスタンスを混乱させていると思います。

「孫」クラス「息子」クラスから派生することができますが、「孫」のインスタンスは、いずれにしても、クラス「息子」

の2つのインスタンスからすることはできません、私はあなたがいけないと思いますそれは、ある時点でクラス「グランド・孫」とクラス「グランド・グランド・孫」を持つことになるからです。

親と兄弟の関​​係を別の方法で作ります。

+4

-1:私は、C++と多重継承をサポートしていない言語を混同していると思います。 –

+0

@ Space_C0wb0y:C++をそれをサポートする言語に正しく混同していないことを確認してください。* –

+0

元の質問の言葉に混乱しているかもしれません。 父と父、息子と派生 – Max

1

これは典型的な継承ダイヤモンドです。 iostreamがistreamとostreamの両方から派生し、これらの両方がios_baseから派生している標準ライブラリでも発生します。

様々な問題があります。父は仮想メソッドを持っており、孫があまりにもそれを実装しない限り、SON1とSon2の両方が、それを実装する場合

  • は、それが実装さSON1とSon2の方法のどの状態があります。

  • 父親にデータメンバーがある場合、孫はそれらを2度取得します。

  • いずれにしても、父親はvテーブルを持っているので、あなたはそれを2部取得するようです。

したがって、中間クラスは通常、仮想継承を使用します。これは難解ですが、最終クラスのみが基本クラスを取得することを意味します。したがって、このケースでは、孫自身が父を築く責任があり、それを「持っている」とみなされます。

ポインタをキャストする場合は、さらに注意が必要です。特にボイド*とのキャストには注意してください。

関連する問題