目錄15.2.2 定義派生類
15.2.3 型別轉換與繼承
定義quote類
class quote
string isbn() const
//返回給定數量的書籍的銷售總額
//派生類負責編寫並使用不同的折扣演算法
virtual double net_price(int n) const
virtual ~quote() = default; //對析構函式進行動態繫結
private :
string bookno; //書籍的isbn號
protected :
double price = 0.0; //代表普通狀態下不打折的**
}
基類通常都應該定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。從基類的角度說
型別無關的成員,直接定義
型別相關的成員,定義為虛函式
從派生類角度說
派生類會繼承基類的成員
可以覆蓋基類的虛函式
從使用者角度說
在用基類的指標或引用呼叫虛函式時會發生動態繫結
關於虛函式virtual更多關於虛函式的討論詳見15.3可以把建構函式之外的任何非靜態函式宣告為虛函式
virtual只能出現在類內部的宣告語句中
派生類如果沒有覆蓋虛函式,則會直接繼承基類的版本
訪問說明符
對類成員
對類使用者
對派生類
public
可見可見
可見private
可見不可見
不可見protected
可見不可見
可見
class bulk_quote : public quote
bulk_quote是quote的派生類
bulk_quote繼承了quote中的成員如isbn\bookno\price等
bulk_quote重定義(覆蓋)虛函式net_price
bulk_quote新增了兩個資料成員
乙個派生類物件包含多個組成部分:
乙個含有派生類自己定義的(非靜態)成員的子物件
乙個與該派生類繼承的基類對應的子物件
如果有多個基類,那麼這樣的子物件也有多個
因為在派生類物件中含有與其基類對應的組成部分
quote item; //基類物件
bulk_quote bulk; //派生類物件
quote *p = &item; //p指向基類物件
p = &bulk; //p指向bulk的quote部分
quote &r = bulk; //r繫結到bulk的quote部分
這種轉換稱之為派生類向基類的型別轉換
在派生類物件中含有與其積累對應的組成部分,這是繼承的關鍵所在。
每個類控制自己的成員初始化過程(介面與類耦合)派生類無法直接初始化從基類繼承的成員,必須使用基類的建構函式來初始化它的基類部分
//實現bulk_quote的建構函式
bulk_quote(const string &book, double p,
int qty, double disc) :
quote(book,p), min_qty(qty), discount(disc){}
派生類的初始化過程:
初始化基類部分:委託基類的建構函式
沒有顯式呼叫基類的建構函式則基類部分進行預設初始化,此時如果基類沒有預設建構函式就會報錯
初始化派生類自己成員
如果繼承有好幾個層級:派生類只初始化它的直接基類,詳見15.4如果基類定義了乙個靜態成員
整個繼承體系中只會由static成員的唯一定義和唯一例項
static成員遵循通用的訪問控制規則
final
防止繼承
class z final ; //z不能作為基類
class a : public z ; //錯誤:z是final的
當基類的指標或引用呼叫虛函式時,會發生動態繫結,此時基類物件的靜態型別和動態型別不一致【引用物件的靜態型別是基類,動態型別可能是派生類】。
其他情況下,靜態型別與動態型別一定一致
當我們用乙個派生類物件為乙個基類物件初始化或賦值時,只有該派生類物件中的基類部分會被拷貝、移動或賦值,它的派生類部分將被忽略掉。
定義基類和派生類
作為繼承關係中根節點的類通常都會定義乙個虛析構函式。基類通常都應該定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。成員函式與繼承 在c 語言中,基類必須將它的兩種成員函式區分開來 一種是基類希望其派生類進行覆蓋的函式 另一種是基類希望派生類直接繼承而不要改變的函式。對於前者,基類通常將其定...
定義基類和派生類
定義基類 對於基類,我們需要記住的是作為繼承關係中根節點的類通常都會定義乙個虛析構函式。基類通常都會定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。成員函式和繼承 派生類可以繼承其基類的成員,也可以對基類中的虛函式進行重新定義。換句話說,派生類需要對這些操作提供自己的新定義以覆蓋 over...
定義基類和派生類
物件導向程式設計的核心思想是資料抽象 繼承和動態繫結。通過繼承聯絡在一起的類構成一種層次關係,通常在層次關係的根部有乙個基類,其他類則直接或間接的從基類繼承而來,這些繼承得到的類稱為派生類。基類負責定義在層次關係中所有類共同擁有的成員,而每個派生類定義各自特有的成員。派生類必須通過使用類派生列表明確...