單繼承派生類建構函式與解構函式順序
阿新 • • 發佈:2018-12-22
派生類建構函式形式:
派生類建構函式 (引數表):基類建構函式(引數表)
類物件成員1(引數表)... 類物件成員n(引數表)//只能用表示式的方式對類物件成員進行初始化
{...派生類自定義的資料成員初始化}
在派生類中,首先呼叫基類的建構函式,其次呼叫物件成員所屬類的建構函式,最後呼叫派生類自己的建構函式,解構函式呼叫順序與上述相反。
下面來看一段程式碼:
#include <iostream> using namespace std; class Num { private: float n; public: Num(float x) { n = x; cout<<"I'm a son."<<endl; } }; class Father { protected: int a,b; public: Father(int x,int y) {a = x;b = y;} //Father(){} ShouValue() { cout<<a<<" "<<b<<endl; } }; class Son : public Father { private: Num nu; int c,d; public: Son(int w,int x,int y,int z,int zz):Father(w,x), nu(zz) {a = w;b = x;c = y;d = z;} ShouValue() { cout<<c<<" "<<d<<endl; } }; int main(void) { Father v1(1,2); Son v2(3,4,5,6,7); v1 = v2; v1.ShouValue(); v2.ShouValue(); v2.Father::ShouValue(); return 0; }
分析:Son是基類Father的單繼承派生類,Num是Son的一個子類(相對於組合類而言),從上述程式碼可以看出,繼承與組合有相似的地方,Son繼承了Father,所以Son中具有Father的資料成員a,b,同時Num與Son組合,那麼Son中就具有了Num中的float e這個資料成員,所以初始化的時候有相似的地方,都是使用表示式初始化。
上述程式碼中Son的建構函式為:
Son(int w,int x,int y,int z,int zz):Father(w,x),nu(zz)
{c = y;d = z;}
我們還可以寫為:
Son(int w,int x,int y,int z,int zz):,nu(zz)
{a = w;b = x;c = y;d = z;}
但是這個時候就要在Father中新增一個無形參的建構函式Father(){},因為在Son的建構函式中把基類的建構函式省略了。