次のコードでは、オブジェクトobj
を作成して、多層継承でコンストラクタの順序を確認しようとしましたが、構造体がobj
であり、コンストラクタが少し奇妙な場合があります。私はobj
のBase1
がある知っている仮想継承での直接ベースの構築方法は?
obj
--Level2
----Base2
----Base1
--Level1
----Base2
----Base1
--Base1
:
class Base1
class Base2
clase Level2
class Base2
class Level1
class Leaf
をしかし、プログラムの最後にOBJの構造は、実際には次のとおりです。コンストラクタを示す出力と
#include<iostream>
using namespace std;
class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl; }
};
class Level1 : public Base2, virtual public Base1
{
public:
Level1(void)
{
cout << "class Level1" << endl;
}
};
class Level2 : public Base2, virtual public Base1
{
public:
Level2(void)
{
cout << "class Level2" << endl;
}
};
class Leaf :virtual public Level2, virtual public Level1
{
public:
Leaf(void)
{
cout << "class Leaf" << endl;
}
};
int main(void)
{
Leaf obj;
return 0;
}
コール仮想継承されるが、obj
の構築時には、Level2
およびLevel1
も構築する必要があり、それぞれの構造においてBase1
に至る。しかし、全体の建設プロセスはBase1
コンストラクターを1回呼び出すだけです。私はこれを説明することはできません。これは、に直接属しているBase1
と同じデータを共有するLevel2
とLevel1
の中のBase1
を意味しますか?
仮想継承の全ポイントは、* 1つの*仮想ベースのサブオブジェクトしか持たないことです。 –
C言語とは異なり、C++では空のパラメータリストは単純に '()'です – curiousguy