型別轉換與繼承
我們可以將基類的指標和引用繫結到派生類物件上。當使用基類的引用或指標時,實際上我們並不清楚我們使用的物件到底是基類物件還是派生類物件。
靜態型別和動態型別
例如item.net_price(),它的靜態型別是quote&,動態型別則根據傳入的實參來決定。如果傳入的是bulk_quote,則動態型別為bulk_quote。
如果表示式既不是引用也不是指標,則它的動態型別永遠與靜態型別一致。
不存在從基類向派生類的隱式型別轉換。
派生類物件之所以可以繫結到基類的指標和引用上,是因為派生類包含基類部分,基類的指標和引用可以繫結到該基類部分。而反過來則不行。
注意了!這句話很重要!
在物件之間不存在型別轉換,派生類向基類的轉換只對指標和引用有效,在派生類型別和基類型別之間不存在這樣的轉換。
如果我們用乙個派生類物件初始化或者賦值乙個基類物件會發生什麼?
bulk_quote bulk;
quote item
(bulk)
;//拷貝建構函式 quote(const quote&)
item = bulk;
//拷貝賦值運算子 quote& operator=(const quote&)
這樣做是可以的,但是這樣做我們只能處理基類部分的成員,派生類部分的成員會被切掉。
也就是下面這句話:
當我們用乙個派生類物件為乙個基類物件初始化或賦值時,只有派生類物件中的基類部分會被拷貝、移動或賦值,它的派生類部分會被忽略掉。
當我們使用基類的引用或指標呼叫乙個虛函式時會發生動態繫結。
因為我們直到執行時才能知道到底呼叫了哪個版本的虛函式,所以所有虛函式都必須有定義。
當某個虛函式通過指標或引用呼叫時,編譯器產生的**直到執行時才能確定應該呼叫哪個版本的虛函式。被呼叫的函式是與繫結到指標和引用上的物件的動態型別相匹配的那個。
經典語錄:
當且僅當對通過指標或者引用呼叫的虛函式時,才會在執行時解析該呼叫,也只有在這種情況下物件的動態型別才有可能與靜態型別不同。
。派生類中的虛函式
一旦某個函式被宣告成了虛函式,則在所有派生類中它都是虛函式。
乙個派生類的函式如果覆蓋了某個繼承而來的虛函式,則它的形參型別和返回值必須與基類型別完全一致。override只用來檢查這種一致性的。
虛函式與預設實參
如果我們使用基類的引用或指標呼叫函式,則使用基類中定義的預設實參,即使實際執行的是派生類中的函式版本。所以實際程式設計中,基類和派生類中定義的預設實參最好一致。
含有純虛函式的類為抽象基類,抽象基類充當了一種介面的作用。
比如說下面的disc_quote類,它用來儲存購買數量和折扣,然後為它的派生類們提供介面net_price()。我們不希望定義這個類的物件,因為它只是用來儲存資料以及提供介面的。
乙個類如果有純虛函式則不能定義這個類的物件。
抽象基類的作用好像就像是把資料從各個類中提取出來一樣。,如果乙個類沒有覆蓋純虛函式,則它依然是乙個抽象基類。
抽象基類disc_quote:
#pragma once
#include
"quote.h"
using
namespace std;
class
disc_quote
:public quote
virtual
double
net_price
(size_t n)
const=0
;virtual
void
debug()
const=0
;protected
:double discount;
size_t quantity;
};
其他類幾乎沒有變動。
友元與繼承
就像友元關係不能傳遞一樣,友元關係同樣也不能繼承。
基類的友元在訪問派生類成員時不具有特殊性,派生類的友元也不能隨意訪問基類成員。
改變個別成員的可訪問性
有時我們需要改變派生類繼承的某個名字的訪問級別,通過使用using宣告可以做到這一點。
#pragma once
using
namespace std;
class
base
protected
: size_t n;
};
#pragma once
#include
"base.h"
using
namespace std;
class
derived
:private base
;
預設繼承方式
用class定義的類,預設繼承方式為private
用struct定義的類,預設繼承方式為public
這次就到這兒吧。
C primer 12 類 主建構函式
1 class 預設成員變數private,struct預設是public 2 class screen const 成員函式set中,this的型別是乙個指向const物件的const指標,就是說,指標位址不可以改,內容也不可以改。而非const函式,this指標位址不可以改,但是指向的內容可以改...
足跡C primer 12 函式過載
main函式不能過載 record lookup const account account是乙個型別 record lookup const phone record lookup const name account acct phone phone record r1 lookup acct ...
C 抽象基類與虛基類(C primer)
c primer plus p508,抽象基類 c primer plus p556,虛基類 抽象基類是解決如下問題 加入現在需要開發乙個圖形類,表示圓與橢圓 注意,圓是一種特殊的橢圓 所以初步考慮從橢圓類中派生出圓類。但是現在遇到乙個問題,圓與橢圓的面積計算公式不同,所以需要建立乙個abc,抽象出...