類的資料成員不但可以是標準型(如int、char)或系統提供的型別(如string),還可以包含類物件,如可以在宣告乙個類時包含這樣的資料成員:
class b;
class a;
這時,s1就是類物件中的內嵌物件,稱為子物件(subobject),即物件中的物件。
在派生類中,子物件為基類在派生類中定義的物件。如下列**:
class student;
class student1:public student;
通過例子來說明問題。在上篇部落格(c++派生類的建構函式)中的派生類student1中,除了可以在派生類中要增加資料成員age和address外,還可以增加「班長」一項,即學生資料中包含他們的班長的姓名和其他基本情況,而班長本身也是學生,他也屬於student型別,有學號和姓名等基本資料,這樣班長項就是派生類student1中的子物件。在下面程式的派生類的資料成員中, 有一項monitor(班長),它是基類student的物件,也就是派生類student1的子物件。
那麼,在對資料成員初始化時怎樣對子物件初始化呢?請仔細分析下面程式,特別注意派生類建構函式的寫法。
[例11.6] 包含子物件的派生類的建構函式。為了簡化程式
以易於閱讀,這裡設基類student的資料成員只有兩個,即num和name。
#include #include using namespace std;
class student//宣告基類
void display( ) //成員函式,輸出基類資料成員
執行派生類建構函式的順序是:
呼叫基類建構函式,對基類資料成員初始化;
呼叫子物件建構函式,對子物件資料成員初始化;
再執行派生類建構函式本身,對派生類資料成員初始化。
派生類建構函式的總參數列列中的引數,應當包括基類建構函式和子物件的參數列列中的引數。基類建構函式和子物件的次序可以是任意的,如上面的派生類建構函式首部可以寫成
student1(int n, string nam,int n1, string nam1,int a, string ad): monitor(n1,nam1),student(n,nam)
編譯系統是根據相同的引數名(而不是根據引數的順序)來確立它們的傳遞關係的。但是習慣上一般先寫基類建構函式。
如果有多個子物件,派生類建構函式的寫法依此類推,應列出每乙個子物件名及其參數列列。
C 派生類的建構函式
1,在使用建構函式的時候,作為派生類會有某些特殊問題。其根源就是建立派生類的時候會有多個建構函式起作用。2,c 中例項化的類的建構函式本身不能初始化類,還必須呼叫基類的建構函式。3,建構函式的呼叫順序是自上向下的,實際上是編譯器先自下而上的尋找建構函式,然後再自上而下的執行 直到達到要例項化的類為止...
C 派生類的建構函式
基類的建構函式不能被繼承,在宣告派生類時,對繼承過來的成員變數的初始化工作也要由派生類的建構函式來完成。所以在設計派生類的建構函式時,不僅要考慮派生類新增的成員變數,還要考慮基類的成員變數,要讓它們都被初始化。解決這個問題的思路是 在執行派生類的建構函式時,呼叫基類的建構函式。下面的例子展示了如何在...
C 派生類的 建構函式
問題 希望執行派生類的建構函式時,使派生類的資料成員和基類的資料成員同時初始化 方案 在執行派生 類建構函式時,呼叫基類建構函式 一般形式 派生類建構函式名 總參數列列 基類建構函式名 參數列列 include include using namespace std class student 宣告...