一、相關概念
類的編譯順序:類名-》成員名-》成員方法體
類的構造順序:成員物件-》類物件
子類的構造:父類-》子類
子類的析構:子類-》父類
過載:函式名相同 引數列表不同 作用域相同
隱藏:子類隱藏父類中同名的成員方法
覆蓋:子類覆蓋父類中相同的許成員方法
動多型:繼承中的多型 執行時期決定的多型
靜多型:模板 過載 編譯期決定的多型
動多型呼叫的要素
1:指標 引用
2:該型別下的虛函式
3:物件完整【物件不完整不可以進行多型呼叫】
二、四種型別強制轉換
1、const_cast:去掉const屬性的型別強轉 const int a = 1; int b = const_cast(a);
2、static_cast:編譯器認為安全的 int a; double b = static_cast(a);
3、dynamic_cast:執行時期的強轉,依靠rttl
·必須是指標
·繼承關係的型別指標
·有rttl
eg:class a }; 基類
class b : public a{}; 派生類
a* a = new a;
b* b = new b;
a = b; -> a = dynamic_cast(b);//error return null
這樣的強轉是不成立的,因為基類中的虛表指標是a* 型別的 但是派生類的虛表指標是b*型別的
b = a; //error
b* b = new a;
a* a = b; -> a = dynamic_cast(b) ->b的型別為b* *b的型別為a
4、reinpreter_cast:強制轉換 等同於(int)
三、相關習題
1:基類指標指向子類物件,指標是什麼型別? *指標是什麼型別?【基類中含有虛函式】
father* f = new child();
typeid(f).name; ->father*
typeid(*f).name; ->child
2:基類構造清楚所有資料,基類指標呼叫自己的虛函式,子類呼叫虛函式
class base
virtual void show() };
class derive :public base
void show() };
int main()
3:基類存在虛函式,子類覆蓋,子類的記憶體布局
base::
vfptr
valdriver::val
【繼承父類的所有成員變數和方法,加上子類特有的成員變數和方法】
4:基類無虛函式,子類有虛函式,子類的記憶體布局,基類指標指向堆上的子類物件
class base
void operator delete(void* p) };
class derive :public base
void* operator new(size_t size) };
int main()
記憶體布局
vfptr
base::
derive::
5:基類定義虛函式和普通過載函式,子類定義同名函式隱藏普通函式和函式
class base
;class derive :public base
;
6:基類指標指向堆上的子類物件,delete,子類析構函式未呼叫,基類析構函式寫成虛函式
class base
virtual ~base() };
class derive :public base
~derive() };
int main()
7:基類虛函式放到共有,派生類虛函式放到私有,外部基類指標指向子類物件 能否派生類私有函式否訪問
class base
};class derive : public base
};int main()
//因為在編譯時期指令已經生成,因此在最後**執行時,系統就只能按照指令訪問派生類中的私有成員方法
8:基類和子類給不同的函式引數預設值,基類指標指向子類物件,呼叫函式
class base
};class deriver :public base
};int main()
//p呼叫的是派生類中的show但是會列印基類中的a,
//這是因為開始構造base我們並沒有給其傳引數,
//於是給在編譯階段就將a賦值成為base本身的預設值,
//在執行時,p找到正確的成員函式後,由於在編譯階段
//已經將10"push"進去了,所以只能執行下去,因此a最終為10
多型相關面試題
多型 同樣的呼叫語句有多種不同的表現形態 同樣乙個函式在不同的子類 父類中穿梭的時候表現出不同的形態。有繼承 有virtual重寫 有父類指標指向子類物件。是通過虛函式重寫實現。virtual關鍵字,告訴編譯器這個函式要支援多型 不是根據指標型別判斷如何呼叫 而是要根據指標所指向的實際物件型別來判斷...
多型相關的面試題
1.如何理解多型。多型的實現效果 同樣的呼叫語句有多種的表現形態 多型實現的三個條件 有繼承 有virtual重寫 有父類指標 引用 指向子類物件 多型的c 實現 virtual關鍵字,告訴編譯器這個函式要支援多型 不是根據指標型別判斷如何呼叫 而是根據指標所指向的實際物件型別來判斷如何呼叫 多型的...
C 多型面試題
答 多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是 乙個介面多種實現 有兩種型別的多型性 編譯時的多型性。編譯時的多型性是通過過載來實現的。執行時的多型性。執行時的多型性是通過虛成員實現的。1.從儲存空間角度。虛函式對應乙個vtable,這個vtable...