多型實現原理 虛函式表記憶體分析及虛基類表的記憶體分析

2021-07-29 20:26:04 字數 1037 閱讀 6145

看了深入探索c++物件模型後的一些感悟

1:虛函式表記憶體分析

每乙個類物件的記憶體由nostatic data member和指向虛數表的指標之和決定。

class a;

a a;

b b; a *p=&b;

a的指標指向派生類b中的基類部分,指標a無法呼叫b中的成員,唯一的例外是指向虛函式表的指標。即基類指標可以通過指向虛函式表的指標來呼叫派生類的虛函式。

繼承後,派生類的虛函式表會和基類的虛函式表相融合,若存在override則在派生類的虛函式表中就覆蓋掉;

像上面的例子:

乙個a類的物件:

int a;

vptr;

這個vptr是指向a虛函式表的指標,a虛函式表:裡存放著指向虛函式的指標,乙個是指向fun1的,乙個是指向fun2的

乙個b類的物件:

int a,

vptr:

這個vptr是指向b的虛函式表指標,b的虛函式表與a的想融合,相同則覆蓋:fun1,fun2,fun3;

這樣當p=&b時,p->fun2是派生類中的fun2;當p=&a時是呼叫基類中的fun2

2:虛基類表

與虛函式表類似,虛繼承中,乙個類除了有nonstaic data member還有指向虛基類表的指標;虛繼承是避免了多繼承中的變數二義性;

class a

class b :public virtual a

class c: public virtual a;

class d:public b,public c;

這樣在d的物件中就有

vptrb

vptrc

int a

int b

int c

int d

vptrb,vptrc分別是從b和c的虛基類表,注意的是這裡的a是虛基類a的成員,它不來自b,也不來自c!!而是直接從a中拷貝過來; 

那樣當d *p=&d;呼叫p->a時,怎麼找到這個a?這就是虛基類表的作用。

虛基類表中存放這派生中基類成員在派生類記憶體的偏移量,這樣就可以通過這找到a.

虛函式表與多型記憶體布局

參考部落格 c 中 的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術 可以讓父類的指標有 多種形態 這是一種泛型技術。虛函式表 每個含有虛函式的類都有乙個虛函式表 virtual table 來實現的。簡...

虛函式及虛函式表

虛函式及虛函式表 首先,我們要分清三大概念 過載 重寫 覆蓋 和重定義 一.函式過載 1 在相同的作用域內 無繼承關係,只在乙個類內進行宣告 2 進行多個函式宣告 3 多個函式的函式名相同,引數列表不同 可以是型別不同 引數型別不同 傳參順序不同 4 函式的返回值型別可以相同,可以不同。不能僅依靠函...

虛函式表分析

project100.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include using namespace std 父類 class base virtual voidg virtual voidh class derive public bas...