2012-02-19 12 views
-2

私は次のコードは、100を印刷した理由を説明してください、次の構造体なぜ次のコードが100を出力するのですか?

struct A 
{ 
    int i; 
    A() { i = 0; } 
    A(int _i) : i(_i) {} 
    virtual void f() { cout << i; } 
}; 



struct B1 : virtual A { 
    B1() : A(1) { f(); } 
    void f() { cout << i+10; } 
}; 


struct B2 : virtual A { 
    B2(int i) : A(2) { f(); } 
}; 


struct C : B1, B2 { 
    C() : B2(3) {} 
}; 

を持っている:(10 + 0)

C* c = new C(); 

私はそれが1111年に印刷すべきだと思う: 最初のA():I = 0 その後、B1は():I = 1とプリントB1::f()から11 その後、B2(): - 私は間違って行く11

プリントがB1::f()を出力しますか?

ありがとうございました

+1

印刷文に改行を追加することで、問題を明確にするのに役立ちます。 –

+0

-1まず、すばらしい[google](http://www.google.co.uk/search?q=c%2B%2B+are+struct+members+public+or+private)を行う価値があります。 [wikipediaエントリー](http://en.wikipedia.org/wiki/C%2B%2B_classes#Differences_between_struct_and_classes_in_C.2B.2B)はこれを簡単に答えています。 –

+0

-1、デクリメントが悪い、今は '10'か' 100'を出力しますか?あなたの質問をどうやってもっと正確にしてください。 –

答えて

1

継承のため、CオブジェクトにはB1オブジェクトとB2オブジェクトが含まれています。 B1オブジェクトとB2オブジェクトはどちらもAオブジェクトを「含む」が、Aの仮想継承を持つため、各Cオブジェクトには2つではなく1つのAオブジェクトしかありません。この単一のAオブジェクトは、Aのデフォルトコンストラクタを使用して初期化されます。

1

パブリックで既定では、構造体。

1

100は印刷されず、10が続き、その後0が印刷されます。

構造体は、フィールドがデフォルトではプライベートかパブリックであることを意味しますか?

公開。

+0

10と0を印刷することが分かりました(これは答えですが、なぜわかりません) 理由を説明できますか? – janneob

関連する問題