c++——繼承類中的子物件和基類物件的初始化
阿新 • • 發佈:2019-01-24
先給結論:
(1)派生類中的基類子物件和子物件必須初始化,初始化在派生類的建構函式的初始化列表中,如果初始化列表中沒有進行初始化,則呼叫預設的建構函式進行初始化。 (2)派生類建構函式的呼叫順序: 基類的建構函式 子物件類的建構函式 派生類的建構函式例子
class point1 { public: point1(); point1(int i); virtual ~point1(); private: int x; }; point1::point1() { x=1; cout<<"point1's default constructor called!\n"; } point1::point1(int i) { x=i; cout<<"point1's constructor called!\n"; } point1::~point1() { } class point2 : public point1 { public: point2(); point2(int i,int j,int k); virtual ~point2(); point1 p; }; point2::point2() { cout<<"point2's defaule constructor called\n"; } point2::point2(int i,int j,int k) { cout<<"point2's constructor called\n"; } point2::~point2() { } //主函式 void main() { point2 pp; point2 pp1(1,2,3); }
執行結果
point1's default constructor called!// point1 p;呼叫了基類預設建構函式
point1's default constructor called!//
point2's defaule constructor called
point1's default constructor called!// point1 p;呼叫了基類預設建構函式
point1's default constructor called!
point2's constructor called
如果函式
point2::point2(int i,int j,int k) { cout<<"point2's constructor called\n"; }
改為:
point2::point2(int i,int j,int k):p(j)
{
cout<<"point2's constructor called\n";
}
執行結果為:
point1's default constructor called! point1's default constructor called! point2's defaule constructor called point1's default constructor called! point1's constructor called! point2's constructor called