2012-04-24 11 views
1

私は仮想継承

class Base1 {}; 

class Base2 {}; 

class Derived : public Base1, public Base2 {}; 

のようなものを持っている場合は、派生のオブジェクトを作る上で、コンストラクタ呼び出しの順序は、彼らが

class Derived : public Base1, public Base2 {}; 

に表示される順序で

Base1 
Base2 

すなわちですが、 クラスに変更した場合Derived:public Base1、virtual public Base2 {}; はその後、コンストラクタ呼び出しの順序は、私はこれがそうである理由を理解することはできませんよ

Base2 
Base1 

なり?

もう1つの疑問: 実質的にBase1を継承する意味と目的は何か。

+2

あなたはまだ11ヶ月ですが、まだあなたの投稿を正しくフォーマットできませんか? – BlackBear

+0

ヘルプhttp://gotw.ca/gotw/080.htm – DumbCoder

+0

「Base1」と「Base2」を宣言しているのに、「Base」と「Base1」を使用しているため、誤植があると仮定しています。 – Cornstalks

答えて

4

これは単なるルールです。構築されている最も派生したクラスは、非仮想直接基底の初期化を開始する前に、最初に階層内のすべての仮想基底クラスを初期化する。

ルールは、標準(ISO/IEC 14882:2011)から来て、セクション12.6.2 [class.base.init]/10

このアプローチの理論的根拠は、それがすべてのベースを確実になりクラスは仮想クラスであるかどうかにかかわらず、派生クラスの前に初期化されます。

1

仮想的に継承します。

別名のような派生クラスを持っている場合は、この問題が発生します。

3

初期化の順番では、チャールズはすでに正しく答えています:それらは規則です、最初に宣言の順で仮想基底、次に宣言の順番に非仮想基底、次にメンバー変数宣言。

仮想継承の意味は何ですか?つまり、オブジェクトはその特定の基底から派生しますが、階層内に複数のサブオブジェクト(完全型の基底)が同じ基本型から実質的に継承される場合は、1つの基本サブオブジェクトのみが存在することを意味します。 virtualのキーワードはとなります。私はbaseを他のオブジェクトであると共有したいと思います。

struct ubase {}; 
struct sbase {}; 
struct A : ubase, virtual sbase {}; // has a sbase subobject, but is willing to share.. 
struct B : ubase, virtual sbase {}; // ... but want to have my own ubase 
struct C : A, B {};     // only one sbase subobject, shared by A and B 
             // ... but two ubase subobjects, A::ubase and B::ubase 

2番目の質問では、いつ仮想継承を使用しますか?型階層では、同じ基底から複数回継承される可能性があり、デザインで基本クラスのすべての出現は1つだけです。一般的に、いくつかの特定のケース以外では仮想継承を使用することはまれです。