我有以下程序:爲什麼C++不允許派生類在初始化列表中使用基類成員?
#include<iostream>
using namespace std;
struct Base01{
int m;
Base01():m(2){}
void p(){cout<<m<<endl;}
};
struct Derived01:public Base01{
Derived01():m(3){}
};
struct Derived02:virtual public Base01{
Derived01():m(4){}
};
struct my: Derived01,Derived02{
my():m(5){}
};
int main(){
return 0;
}
兩個GCC /鐺報道編譯錯誤。
我只想知道這裏的語言設計考慮什麼,爲什麼派生類只能在初始化列表中調用基類ctor,但不能直接使用基類成員?
排序中的一個錯誤 - 派生的構造函數可以控制基類子對象構造函數的參數,如果在派生構造函數得到控制之前調用基構造函數,這顯然是不可能的。談論施工責任可能會更好。 (當然,無論先發生什麼,雙重初始化仍然是個問題) –
@ BenVoigt好點。我的意思是說,基類是首先構造的,並且只有在派生類構造函數中發生「其他所有事情」之後纔會構造基類。但是,當然,如果語言允許用戶在派生contsructor初始值設定項列表中引用基類成員,那麼排序規則將會不同(很有可能)。無論排序如何,避免雙重初始化的問題仍然存在。 – AnT