隱藏: overhide 派生類中隱藏了基類中所有的同名函式
①同名、不同參
②繼承關係下的不同作用域
覆蓋:派生類中同名同參的虛函式覆蓋基類中同名同參的虛函式
①同名同參
②繼承關係下的不同作用域
③均為虛函式
隱藏:
class base
void show()
protected:
int ma;
};class derived :public base
void show()
protected:
int mb;
};int main()
執行結果:
覆蓋:加上virtual
class base
virtual void show()//虛函式 ==> 多型
protected:
int ma;
};class derived :public base
void show()
protected:
int mb;
};int main()
執行結果:
父類的show()為非virtual函式,呼叫它的物件型別為靜態型別即父類(靜態),所以呼叫的是父類的物件, 隱藏了子類的函式;
父類的show()為virtual函式,呼叫它的物件型別為動態型別即指標指向的型別(動態),所以呼叫的是子類的型別,覆蓋父類。
同一介面,不同形態
本質:介面復用
分類:1、靜多型:編譯期間(例如:函式過載、模板)
2、動多型:執行期間
3、巨集多型:預編譯
可以看見,虛表會合併,虛函式指標也會合併:
虛表的寫入時機:在建構函式的第一行**的執行之前
(派生類的執行會多次賦虛表的寫入)
動多型的發生條件:
指標/引用 呼叫虛函式&&物件完整
q:哪些函式可以成為虛函式?-------->析構函式
條件:1、要能取位址(因為虛函式的虛表中放了入口位址)
2、依賴物件呼叫
來看一段**~
只有a的析構,是因為pb是a*
修改**:在派生類的~a()加上virtual
基類指標指向派生類物件,基類設定虛析構!因為這樣的話就可以
pb->b~ destructor
pb->a~ destructor
可以自己畫個圖~就好理解啦!!!
虛函式,覆蓋和多型
一.函式宣告中的virtual關鍵字 形如 class 類名 的成員函式,稱為虛函式或方法 class shape 一.在子類中覆蓋基類的虛函式 如果子類的成員函式和基類的虛函式具有相同的函式原型,那麼該成員函式就也是虛函式,無論其是否帶有virtual關鍵字,且對基類的虛函式構成覆蓋 class ...
虛函式和純虛函式 覆蓋和隱藏
虛函式 virtual void breather cout annimal breather 從 中可以看出,虛函式有方法體。虛函式主要是c 的多型性,當編譯器編譯的時候,發現breather 是乙個虛函式,這時候c 就會才用遲繫結 late binding 技術。也就是編譯時不確定具體呼叫的函式...
過載覆蓋多型和虛函式
現在整理出來,希望可以記住這個。函式的名稱一樣,但是引數不同,就是過載 函式的名稱知道了,但是編譯的時候不知道呼叫哪個函式,過載決議 根據引數決定到底應該呼叫哪個函式 區別就是 呼叫的引數不一樣 對於非虛函式,子類和基類同名 不管引數 那麼就是導致覆蓋 如果引數完全一樣,那麼會完全覆蓋,只會留下子類...