1. 程式人生 > >單繼承派生類建構函式與解構函式順序

單繼承派生類建構函式與解構函式順序

派生類建構函式形式:

派生類建構函式 (引數表):基類建構函式(引數表)
    類物件成員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的建構函式中把基類的建構函式省略了。