c++多層派生時的建構函式
乙個類不僅可以派生出乙個派生類,派生類還可以繼續派生,形成派生的層次結構。在上面敘述的基礎上,不難寫出在多級派生情況下派生類的建構函式。
通過例下面的程式,讀者可以了解在多級派生情況下怎樣定義派生類的建構函式。相信大家完全可以自己看懂這個程式。
[例] 多級派生情況下派生類的建構函式。
#include
#include
using namespace std;
class student//宣告基類
void display( )//輸出基類資料成員
{ cout
執行時的輸出如下:
num:10010
name:li
age:17
score:89
請注意基類和兩個派生類的建構函式的寫法。
基類的建構函式首部:
student(int n, string nam)
派生類student1的建構函式首部:
student1(int n, string nam],int a):student(n,nam)
派生類student2的建構函式首部:
stu程式設計客棧dent2(int n, string nam,int a,int s):student1(n,nam,a)
注意不要寫成:
student2(int n, string nam,int a,int s):student1(n,nam),student1(n, nam, a)
不要列出每一層派生類的建構函式,只需寫出其上一層派生類(即它的直接基類)的建構函式即可。在宣告student2類物件時,呼叫student2建構函式;在執行student2建構函式時,先呼叫student1建構函式;在執行student1建構函式時,先呼叫基類student建構函式。初始化的順序是:
先初始化基類的資料成員num和name。
再初始化student1的資料成員age。
最後再初始化student2的資料成員score。
c++派生類建構函式的特殊形式
在使用派生類建構函式時,有以下特殊的形式。
1) 當不需要對派生類新增的成員進行任何初始化操作時,派生類建構函式的函式體可以為空,即建構函式是空函式,函式體為空時,派生類建構函式的引數個數等於基類建構函式和子物件的引數個數之和,派生類建構函式的全部引數都傳遞給基類建構函式和子物件,在呼叫派生類建構函式時不對派生類的資料成員初始化。此派生類建構函式的作用只是為了將引數傳遞給基類建構函式和子物件,並在執行派生類建構函式時呼叫基類建構函式和子物件建構函式。在實際工作中常見這種用法。
2) 如果在基類中沒有定義建構函式,或定義了沒有引數的建構函式,那麼在定義派生類建構函式時可不寫基類構造程式設計客棧函式。因為此時派生類建構函式沒有向基類建構函式傳遞引數的任務。呼叫派生類建構函式時系統會自動首先呼叫基類的預設建構函式。
如果在基類和子物件型別的宣告中都沒有定義帶引數的建構函式,而且也不需對派生類自己的資料成員初始化,則可以不必顯式地定義派生類建構函式。因為此時派生類建構函式既沒有向基類建構函式和子物件建構函式傳遞引數的任務,也沒有對派生類資料成員初始化的任務。
在建立派生類物件時,系統會自動呼叫系統提供的派生類的預設建構函式,並在執行派生類預設建構函式的過程中,呼叫基類的預設建構函式和子物件型別預設建構函式。
如果在基類或子物件型別的宣告中定義了帶引數的建構函式,那麼就必須顯式地定義派生類建構函式,並在派生類建構函式中寫出基類或子物件型別的建構函式及其參數列。
如果在基類中既定義無參的建構函式,又定義了有參的建構函式(建構函式過載),則在定義派生類建構函式時,既可以包含基類建構函式及其引數,也可以不包含基類建構函式。
在呼叫派生類建構函式時,根據建構函式的內容決定呼叫基類的有參的建構函式還是無參的建構函式。程式設計者可以根據派生類的需要決定採用哪一種方式。
本文標題: 解析c++中多層派生時的建構函式及一些特殊形式
本文位址: /ruanjian/c/131506.html
多層派生時的建構函式
乙個類不僅可以派生出乙個派生類,派生類還可以繼續派生,形成派生的層次結構 例 多層派生情況下派生類的建構函式 include includeusing namespace std class student void display protected int num string name cla...
C 多層派生時的建構函式順序問題
在派生類物件的建立過程中,首先是虛基類的建構函式被呼叫,並按照他們宣告的順序來構造,第二批是非虛基類的建構函式按他們的宣告順序呼叫,第三批是成員物件的構造函式呼叫,最後是派生自己的建構函式被呼叫。乙個類不僅可以派生出乙個派生類,派生類還可以繼續派生,形成派生的層次結構。在上面敘述的基礎上,不難寫出在...
C 中派生類建構函式解析
簡單的繼承方式 class parent class son public parent 上面的 完成了下面的工作 派生類物件儲存了基類的資料成員 派生類繼承了基類的實現 派生類物件可以使用基類的方法 派生類繼承了基類的介面 派生類需要進行下面的工作 需要自己的建構函式 可 以根據需要新增額外的資料...