C++ 子類繼承和呼叫父類的建構函式方法
阿新 • • 發佈:2021-01-21
子類的建構函式
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。
如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。
子類建構函式的呼叫規則
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。 2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。 3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。 4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。 5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。 6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式。
特別的,對於6這種情況,我們可以使用子類建構函式:父類()的方法來呼叫父類的有參構造
Son() :Base(1, 2, 3){}
例子
//父類Base
class Base {
public:
//父類的有參構造
Base(int a, int b, int c) : m_A(a), m_B(b), m_C(c) {
cout << "Base的有參構造" << endl;
}
~Base() {
cout << "Base的解構函式" << endl;
}
void printC() {
cout << m_C << endl;
}
void setC(int c) {
m_C = c;
}
int m_A;
protected:
int m_B;
private:
int m_C;
};
//子類Son
class Son : public Base {
public:
//子類Son呼叫父類的有參構造
Son() :Base(1, 2, 3) {
cout << "Son呼叫Base的有參構造" << endl;
}
public:
int m_D;
};
void test() {
Base b1(1, 2, 3);
b1.printC();
Son s1;
s1.Base::printC();
}
int main() {
test();
system("pause");
return 0;
}