類的繼承 多型的實現原理

2021-08-20 08:48:44 字數 1121 閱讀 3848

本文參照於狄泰軟體學院,唐佐林老師的——《c++深度剖析教程》

在c++中用virtual關鍵字解決了父子間同名覆蓋的問題。這也是物件導向中多型的概念。但是,編譯器到底如何實現多型的呢?

當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表虛函式表示乙個儲存成員函式位址的資料結構

虛函式表是由編譯器自動生成與維護

virtual成員函式會被編譯器放入虛函式表中

存在虛函式時,每個物件中都有乙個指向虛函式表的指標

實際上,當我們用virtual關鍵字定義虛函式時,c++編譯器自動幫我在類中生成了乙個vptr指標指向虛函式表。

示例**:多型的本質

#include 

#include

using

namespace

std;

class demo

};class derived : public demo

void print()

};int main()

輸出結果:

sizeof(demo) = 12

sizeof(derived) = 16

問題:編譯器是如何呼叫虛函式的呢?

虛函式呼叫過程

編譯器首先確認add是否為虛函式。

yes –> 編譯器在物件vptr所指的虛函式表中查詢add()的位址

no –> 編譯器直接可以確定呼叫成員函式的位址

因此:虛函式的呼叫效率比普通成員函式要低。在專案中慎用!

類的繼承和實現原理

1.類的繼承例項 class hero aa 11 def init self,name,life,damage self.name name self.life life self.damage damage defattack self,enemy enemy.life self.damage ...

類的封裝繼承多型

繼承 子類繼承父類上的屬性和方法 目的是讓子類的例項享有父類的屬性和方法 為什麼要繼承?步驟 套路 定義父型別建構函式 給父型別的原型新增方法 定義子型別的建構函式 繼承父型別 子型別的原型為父型別的乙個例項物件 關鍵 讓子型別的原型的constructor指向子型別 給子型別的原型新增方法 建立子...

類的繼承與多型

繼承 概念 子類可以繼承父類的一切 方法重寫 在子類裡面對父類的方法進行重寫 特點 單繼承 乙個子類只能有乙個父類,乙個父類可以派生出多個子類 override 重寫 overload 過載,編譯多型 class ren class china extends ren class america e...