寫在前面
上一篇文章派生與繼承介紹了派生與繼承的一些基本知識,在這裏我們將學習派生類的說明和構造函數。
派生類的說明
格式
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!