問題描述:
在stackoverflower上發現的一個問題,覺得挺有意思,自己之前也沒有注意到,貼出來分享一下
這裏面的內容實在討論在子類的初始化列表中,如果對子類的成員變量進行初始化,然後調用父類的構造函數,那麼他們的執行順序會是什麼樣的,話不多說,碼來!
#include<iostream>
using namespace std;
class parent {
int a;
public:
parent() :a(123) {
cout << "parent constructor is called\n";
}
};
class A {
public:
A(int a) { cout << a<<"A constructor is called\n"; }
};
class son : parent
{
A a1;
A a2;
public:
son() :a1(2),a2(3), parent()
{
cout << "son constructor is callede\n";
}
};
int main()
{
son s;
system("pause");
return 0;
}
運行結果
parent constructor is called
2A constructor is called
3A constructor is called
son constructor is callede
分析:雖然按照常理,在初始化列表中,初始化的順序是從左到右的,但是在加入了的構造函數之後,就會先去對父類初始化,這也符合我們的認知,因爲在集成體系中的調用順序就是這樣的,如果我們在子類的構造函數中不顯示的調用父類的構造函數,那麼結果並不會發生變化