隱藏和覆蓋 多型 虛函式 C

2021-09-09 06:31:12 字數 2358 閱讀 1263

隱藏: 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 技術。也就是編譯時不確定具體呼叫的函式...

過載覆蓋多型和虛函式

現在整理出來,希望可以記住這個。函式的名稱一樣,但是引數不同,就是過載 函式的名稱知道了,但是編譯的時候不知道呼叫哪個函式,過載決議 根據引數決定到底應該呼叫哪個函式 區別就是 呼叫的引數不一樣 對於非虛函式,子類和基類同名 不管引數 那麼就是導致覆蓋 如果引數完全一樣,那麼會完全覆蓋,只會留下子類...