物件導向程式設計 我的虛函式實現方法

2021-08-26 01:50:44 字數 706 閱讀 2182

如下圖所示:

類,即代表類也代表函式表,我們看是怎麼呼叫的.

注意如下規則:

1、每個類的資訊都儲存在記憶體裡(型別載入後);

2、每個類都會儲存其繼承的父類或實現的介面的型別指向。

3、每個例項都保持乙個對例項實際型別(類型別)的指向(指標),

還保持乙個對例項變數型別的指標。

4、類例項化時,類方法不會複製,但成員變數都會按類資訊重新分配記憶體,

並初始化其值,父類的成員變數也都會分配記憶體,並屬於當前例項

當然,實際語言的規則可能更複雜,但原理就是這樣。在實現時,

也可以適當冗餘一些資訊,比如父類中子類可以訪問的方法在子

類資訊中儲存乙份搜尋資訊(比如是否虛函式,是否繼承,是否重

寫等資訊)。這樣編譯的時候可能慢點,記憶體占用比較大點,但

搜尋起來就很快。不用按不同的方法遍歷兩次。

比如a a = new d();a.f().

建立例項a時,a儲存有實際型別d和變數型別a的型別資訊存放位址。

當呼叫a的方法f,即執行a.f()時,首先在實際型別d中找到方法f,因為

f是重寫方法(虛函式在當前型別的重寫),按尋找規則,則呼叫d的f.

a a = new c();a.f():

首先在c中尋找f,發現沒有,則在c的父類b中找,規則一樣,在b中找到。則呼叫b的f方法。

這就是我理解的類的繼承中虛函式的實現方式。

物件導向程式設計複習(一) 繼承 虛函式

題目描述 普通會員類member,包含編號 姓名 積分三個屬性,編號和積分是整數,姓名是字串 操作包括構造 列印 積分累加 積分兌換,操作定義如下 1 積分累加add,是根據消費金額累加積分,無返回值,引數是消費金額 整數 積分根據消費金額按1比1的比例累加 2 積分兌換exchange,是按照每1...

物件導向 多型(虛函式)

虛函式 用關鍵字virtual修飾的 類的成員函式 虛函式定義 語法形式 class x虛函式的意義 即虛函式的虛特徵 基類指標 或引用 指向 派生類的物件時,通過該指標 或引用 訪問派生類中的虛函式時,將呼叫該指標 或引用 實際所指物件的成員函式!指標和引用給基類的是派生類的位址 例子 class...

物件導向程式設計 虛函式表和虛基類表

一 虛函式表 每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的 如果派生類是多重繼承,則有多少個有虛函式的基類,就對應有多少個虛函式表。這說明沒有另外生成乙個派生類自己的虛函式表指標。那派生...