引言:
繼承固然為我們節省了不少的時間和工序,但是由於子類是由基類派生出來的,因此我們在建立派生類的物件時,仍然需要對基類進行初始化。原因也不難理解,因為子類將基類的所有成員都繼承了過去,所以被繼承的成員也會出現在子類裡,那麼我們在構造乙個子類的物件時,就會難免呼叫基類的建構函式。
在建立派生類的建構函式時,有兩種方法可以對資料進行初始化。
第一種:在派生類中建立乙個建構函式,然後初始化所以資料(從基類那裡繼承來的資料和子類的資料)。這種方法顯然是多餘的,因為基類已經有了恰當的建構函式,況且在派生類中對基類進行初始化的這種做法也不可取。
第二種:在派生類中建立乙個建構函式,然後用該構造函式呼叫基類的建構函式並且向建構函式傳遞初始值。
顯然,第二種方法的效率要高一些,並且出錯的機率要小些。
下面我們用例項進行一下說明:
首先採用第一種方式,也就是在子類的建構函式中為子類物件的所以資料成員賦值。
code 1:
#include
#include
using namespace std;
class father
~father()
void print()
protected:
string name;
int height;
};class son:public father
~son()
void print1()
protected:
int weight;
};int main()
該方法的弊端:在呼叫父類的建構函式時對與建立子類物件沒有什麼左右,該父類建構函式的呼叫不關沒有用,還增加了系統的開銷。乙個高質量的**是不應當產生或者應該盡量避免產生多餘的系統開銷的。我們通過方法2來解決這個問題。相關的程式**如下:
code 2:
#include
#include
using namespace std;
class father
~father()
void print()
protected:
string name;
int height;
};class son:public father
~son()
void print1()
protected:
int weight;
};int main()
這樣我們就在構造子類物件之前,呼叫父類的帶兩個引數的建構函式完成了對父類的兩個成員name和height的賦值。這樣子類物件在繼承了這兩個成員之後就不再對這兩個成員進行賦值了,而只需要對子類中的資料成員(weight)進行賦值。這樣父類的建構函式就充分被利用起來了。另外,顯示地呼叫父類的建構函式可使**的可讀性增強,別人在度這段**的時候,一下子就可以明白子類建構函式中前兩個引數的值是通過父類的建構函式賦給了父類中定義的兩個成員,而不是賦給了子類中定義的成員,子類僅僅是繼承了父類的兩個成員。這種將父類成員和子類成員分開賦值的方法,可以使**的可讀性大大增強,同時減少了出錯的可能。
向基類建構函式傳遞引數的 兩種方法
1.如果沒有定義派生類的建構函式,那麼將預設執行基類的建構函式.2.如果派生類要向基類傳遞引數,那麼必須在派生類裡定義乙個建構函式,該函式只起到向基類傳遞引數的作用 3.如果只需要呼叫基類的建構函式,不用向基類傳遞引數的話,那麼派生類不用定義建構函式 include include using na...
C 虛基類建構函式
c 虛基類建構函式 下面文章詳細介紹c 虛基,所謂c 虛基類 是由最派生類的建構函式通過呼叫虛基類的建構函式進行初始化的,但前提是要深入理解到底什麼是c 虛基類,及他是怎麼執行的。前面講過,為了初始化基類的子物件,派生類的建構函式要呼叫基類的建構函式。對於虛基類來講,由於派生類的物件中只有乙個虛基類...
抽象基類建構函式初探
抽象基類建構函式可以定義在類外麼?顯然可以 pragma once include using std string class quote virtual double netprice size t n const virtual quote default private string boo...