1. 多態:
即基類的指標或者引用可以直接操作或引用其任何派生子類的能力,
使得基類在運行時可以表現為更多類類型的資料對象,這個類似於C中的
void * 資料結構可以匹配任意資料類型的指標功能相似.
1) private 聲明的資料衍生類別不可訪問,需要聲明為友元才能訪問 ,即在基類中聲明 friend class 衍生類別
2) protected 聲明的資料衍生類別可以訪問,外部資料不可以直接存取.
3) 設計基類的時候,與類型相關的成員函數需要設計為虛函數.
4) 基類的函數不可以在衍生類別中重載,需要用using 基類::介面 來實現將基類的重載函數集載入到衍生類別中,實現重載.
5)虛函數與純虛函數(抽象類別)
虛函數: virtual void p(void); 基類需要實現,即便實現為空白函數
純虛函數: virtual void p(void) = 0; 基類不需要實現,包含純虛函數的類稱為抽象基類,不可以直接被執行個體化,需要在衍生類別中實現.
2. 繼承
虛擬繼承: class a: virtual public b{}; a虛擬繼承b, 虛擬繼承的基類優先構造
3. 封裝
在程式上,隱藏對象的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀和修改的存取層級;
將抽象得到的資料和行為(或功能)相結合,形成一個有機的整體,也就是將資料與操作資料的原始碼
進行有機的結合,形成“類”,其中資料和函數都是類的成員.
4. 抽象
把同類事物的根本的,本質的,相同的,不變的概括出來就叫抽象.
5. 異常
a) try,throw,catch
try{
throw 類建構函式;
}
catch(類名){
}
b) 異常規範與函數指標
在函數或者函數指標聲明的時候指定異常規範,如:
void pf(void) throw(string); //pf函數可以拋出string的異常
void (*pg)(void) throw(int, string); //pg函數可以拋出int和string的異常
*pg = &pf; // pg的異常規範必須要比pf的嚴格,否則編譯錯誤
c) 衍生類別中虛函數的異常規範比基類的更嚴格.
6. 類的構造
class a{};
class b : public class a{};
b b1;
a a1 = b1;
a) 調用a(a) 構造,即default copy construct方法
b) 沒有虛方法時 bitwise copy
c) 有虛方法時 bitwise copy失效,使用編譯成產生copy construct 方法
d) 有虛繼承的時候 bitwise copy失效,使用編譯成產生copy construct 方法
e)子類給父類賦值時 bitwise copy失效,使用編譯成產生copy construct 方法
f) 右值為指標的賦值時bitwise copy失效說,使用編譯成產生copy construct 方法
補充:
--------------------------------------------
foo()
{
//構造word
return word;
} //返回之後需要調用copy construct
和 foo(_result)
{
//構造_result
return;
}
的效率區別.
-----------------------------------------------
-----------------------------------------------
成員初始化列表(列表從右開始,列表的構造是安插到建構函式中的)
word::word():a(b)
{
} //直接調用a的建構函式
與 word::word()
{
a = b;
} //先構造a,再建立b的臨時對象,再copy construct
的效率區別
-----------------------------------------------
7. 繼承與虛擬繼承
a) 沒有虛函數也沒有虛繼承的單一繼承 跟C一樣線性分布
b) 沒有虛函數也沒有虛繼承的多繼承 跟C一樣線性分布
c)有虛函數沒有虛繼承的單一繼承 跟C一樣線性分布(帶有虛函表)
d)有虛函數沒有虛繼承的多繼承 跟C一樣線性分布(帶各父類的有虛函表)
e) 既有虛函數也有虛繼承的單一繼承 不變局部和共用局部(虛繼承基類,通過編譯器在不變局部安插指標或者在虛函表指出offset)各部分線性布局
f) 既有虛函數也有虛繼承的多繼承 不變局部和共用局部(虛繼承基類,通過編譯器在不變局部安插指標或者在虛函表指出offset)
類名::* 表示指向類成員member的類型
&類名::成員 成員在類中的offset
&類執行個體對象::成員 執行個體類成員在記憶體中的實際地址
8.構造
a) 沒有虛繼承的構造,base class object 的構造直接按順序插入帶衍生類別的construct裡面.
b) 汗有虛繼承的類都加一個if()條件來控制virtual base class的構造,只有第一次條件為真,後面的都為假
c) 在構造的過程中vptr要跟對應的class 對應,這就要求在構造的過程中會頻繁的初始化和設定vptr.
9. 運行時