為什么對ChildLabourer初始化列表不能寫成這樣?ChildLabourer(string name, int age):m_strName(name),m_iAge(age)
既然都公有繼承了父類,那么子類就應該可以對父類數據成員m_strName和m_iAge進行初始化列表呀,為什么還得用父類的構造函數進行初始化列表 ChildLabourer(string name, int age):Worker(name),Children(age) ???
代碼如下:
class?ChildLabourer?:?public?Worker,public?Children { public: ChildLabourer(string?name,?int?age):m_strName(name),m_iAge(age) { cout?<<?"ChildLabourer"?<<?endl; } ~ChildLabourer() { cout?<<?"~ChildLabourer"?<<?endl; } };
2019-08-07
編譯器給出的提示是ChildLabourer類沒有m_strName和m_iAge成員變量。
推測是子類的初始化列表先于父類的構造函數執行,否則無法將參數傳遞給父類。因此在執行ChildLabourer的初始化列表時,父類(Worker, Children)的構造方法尚未執行,當然成員變量(m_strName, m_iAge)也就不存在,因此不能在子類的初始化列表中初始化父類的成員變量。
2019-09-09
回答的不錯,我覺著還有點需要補充。實例化子類對象時,需要先實例化父類的對象,因為父類沒有默認構造函數,所以必須得給父類構造函數傳參,后面就是樓主所說的了:初始化列表是早于構造函數運行的,早于父類子類的構造函數。如果父類有默認構造函數的話,就不需要傳參了。如果要傳參,只能先實例化父類對象,也就是在初始化列表中一步完成實例化,后面也就用再實例化了。