標籤:基本 類繼承 效率 不能 強制 tail 工作 nbsp 初始化
一、繼承:
1. 衍生類別是基類的is-a(is-a-kind-of)關係。
2.基類的所有功能對衍生類別都有意義。
3.虛繼承是解決多重繼承中,對基類二義性問。詳細原理參考http://blog.csdn.net/u013630349/article/details/47057929。
二、組合:
1.類B由類A組合而成,一般稱為is-a-part-of關係。
三、多態:
1.每一個多態類有一個虛函數表(函數指標數組,放在待用資料區,不屬於執行個體,每個執行個體用虛函數指標訪問),包含虛函數的地址和類型資訊,函數調用類似於:(*(p->vptr[slotNum]))(p, arglist).
2.虛函數必須有相同的函數原型,但是傳回型別可以不同。
3.多態對象數組,訪問時可能訪問錯位,釋放記憶體時子類可能沒有釋放。
4.衍生類別不能繼承基類的靜態成員。
5.基類已經插入vptr,則衍生類別繼承並重用vptr。
6.衍生類別繼承多個類,每個繼承分支繼承一個vptr。
7.vptr一般放在資料成員的最前面,為支援RTTI,為每個多態類建立一個type_info對象,地址儲存在vtable的固定位置(一般在第一個位置)。
8.由於每個虛函數原型可能不同,虛函數表將所有函數強制轉換為一個類型,儲存函數地址,運行使用時,根據執行個體對象強轉為對應的函數,函數調用類似於:(*(Realtype)(p->vptr[slotNum]))(p, arglist)..
9.vptr在建構函式中初始化,先初始化基類的vtable,再根據衍生類別不斷修改vtable,在vtable同一位置覆蓋原有基類的虛函數。
10.建構函式先初始化vptr,因此建構函式內部可以使用多態調用虛函數。
四、基本元素:
1.vptr,預設建構函式,預設解構函式,預設拷貝建構函式,預設賦值函數。
五、對象:
1.預設建構函式和預設賦值函數會調用每個資料成員的預設建構函式和預設賦值函數,基礎資料型別 (Elementary Data Type)則按bit拷貝。
2.建構函式的初始化列表工作在函數體執行之前,規則如下:
1) 類存在繼承關係,需要在初始化列表調用基類的建構函式。
2)非晶態const資料成員和引用成員只能在初始化列表調用。
3)資料成員是類的話,放在函數體內初始化效率低,如:
A::A(const A& a)
{
m_a =a;
}
先調用A的預設建構函式初始化m_a,再調用A的賦值函數將a傳給m_a。
4)類的初始化規則,先在初始化列表調用基類建構函式,接著在初始化列表調用本類的資料成員,最後在函數體內完成其他初始化工作。
3.不能同時定義無參建構函式和所有參數都有預設值的建構函式。
4.拷貝建構函式參數必須是同類對象的引用,不能是對象值,沒有其他參數,或者其他參數都有預設值。
C++類