でコンストラクタ/デストラクタ呼び出しの順序を説明する:は、私はこのC++のコードを持って、このC++コード
BaseClass()
Class1()
BaseClass()
Class2()
BaseClass()
Class1()
BaseClass()
Class2()
BaseClass()
Class3()
~Class2()
~BaseClass()
~Class1()
~BaseClass()
~Class2()
~BaseClass()
~Class1()
~BaseClass()
~Class3()
~BaseClass()
と私は理由を理解していない:
class BaseClass {
int id;
public:
BaseClass() { printf("BaseClass()\n"); }
virtual ~BaseClass() { printf("~BaseClass()\n"); }
};
class Class1 : public BaseClass
{
int id;
public:
Class1() { printf("Class1()\n"); }
~Class1() { printf("~Class1()\n"); }
};
class Class2 : public Class1
{
BaseClass id;
public:
Class2() { printf("Class2()\n"); }
~Class2() { printf("~Class2()\n"); }
};
class Class3 : virtual public BaseClass
{
int id;
public:
Class3() { printf("Class3()\n"); }
~Class3() { printf("~Class3()\n"); }
};
class Class4 : public Class3, virtual public Class1
{
Class3 id;
public:
Class4() { printf("Class4()\n"); }
~Class4() { printf("~Class4()\n"); }
};
int main(int argc, char* argv[])
{
BaseClass *p = new Class2;
Class2 *p1 = new Class2;
Class3 *p2 = new Class3;
delete p;
delete p1;
delete p2;
return 0;
}
これが出力されます。
BaseClass()
Class1()
Class2()
BaseClass()
Class1()
Class2()
...
など
例えば、作成するときにClass2()
が
Class1()
後に印刷されていないのはなぜ
、p1
:私は、出力は次の通りであることを期待しますか? これは仮想継承と関係がありますか?
を取得しますので、クラスBの構成は、第1に構築されるクラスAを必要とする - Bの建設は、私が誤って左 –
@songyuanyaoの使用を必要とするかもしれないとして、出力をコピーするときの最初の行、それについて残念。 – Eutherpy