派生類的說明和構造函數

寫在前面

上一篇文章派生與繼承介紹了派生與繼承的一些基本知識,在這裏我們將學習派生類的說明和構造函數。

派生類的說明

格式

class <類名>:<基類說明表>{
private:
    <私有成員表>
protected:
    <保護成員表>
public:
    <公有成員表>
};

其中<基類說明表>可以列出一個或多個基類,每個基類說明格式爲:<派生方式><基類名>

例子

class D: public A, private B, protected C{
    ...
};

派生類的構造函數

格式

<派生類名>(<參數總表>):<初始化符表>{
    <構造函數體>
};

<參數總表>列出對象初始化需要的所有參數

<初始化符表>按如下格式構成:

<基類名1>(<基類參數表1>),...,<基類名n>(<基類參數表n>),<對象成員名1>(<對象成員參數表1>),...,<對象成員名n>(<對象成員參數表n>)

例子

class D: public A, private B, protected C{
    ...
public:
    D(int a, int b, int c, int d) :A(a), B(b), C(c){ 
        ...
    }
};

構造函數的調用按class D: public A, private B, protected C中基類的順序從左到右依次執行,然後再是初始化符表中的對象成員(此例中沒有),最後纔是自身,因此總的順序是A->B->C->D。

綜合例子

#include<iostream>
using namespace std;

class A{
    int a;
public:
    A(int n){ a = n; cout << "A::a = " << a << endl; }
    ~A(){ cout << "A destructed!" << endl; }
};

class B{
    int b;
public:
    B(int n){ b = n; cout << "B::b = " << b << endl; }
    ~B(){ cout << "B destructed!" << endl; }
};

class C:public A{
    int c;
public:
    C(int na, int nc) :A(na){ c = nc; cout << "C::c = " << c << endl; }
    ~C(){ cout << "C destructed!" << endl; }
};

class D :public B, public C{
    int d;
public:
    D(int nb, int nc1, int nc2, int nd) :B(nb), C(nc1, nc2){ d = nd; cout << "D::d = " << d << endl; }
    ~D(){ cout << "D destructed!" << endl; }
};

int main(){
    D obj(1, 2, 3, 4);
}

輸出

B::b = 1
A::a = 2
C::c = 3
D::d = 4
D destructed!
C destructed!
A destructed!
B destructed!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章