可能性の重複:私は複数を使用している場合、コンパイラは異なる初期値を処理する方法を疑問を抱いていますこんにちはすべて
gcc c++ virtual inheritance problem仮想基底クラスと初期化リスト
、
仮想基本クラスからの継承。私は(例えばhere参照)D1
とD2
のための仮想継承を使用し、Join
にBase
の2つのコピーを避けるために
Base
/\
/ \
D1 D2
\ /
\/
Join
:悪名高い「恐怖のダイヤモンド」継承スキームを考えてみましょう。
class Base {
public:
Base(int x_) {x = x_;};
virtual ~Base(){};
public:
int x;
};
class D1 : public virtual Base {
public:
D1() : Base(1) {};
virtual ~D1(){};
};
class D2 : public virtual Base {
public:
D2() : Base(2) {};
virtual ~D2(){};
};
class Join : public D1, public D2 {
public:
Join(){};
~Join(){};
};
int main()
{
Join j;
cout << j.x << endl;
return 0;
}
出力は1、2であるか、またはそれは、コンパイラに依存する:?今、Base
が抽象的ではなく、そのコンストラクタで初期化されたメンバーフィールドを持って言うことができますか
新しいものは必要ありませんが、テストケースコードは 'Join j; cout << j.x; '。 –
@Charles、この質問はGCC固有ではないので、厳密には重複していません。同じ問題に対処していますが、答えはコンパイラに依存しません。 –
@ SergeyTachenov:gccに固有の質問でもありません。ちょっと誤解を招くタイトルにgccがあるだけです。 –