面試經 VPTR和VTBL

2021-06-29 03:45:58 字數 4008 閱讀 5447

假設是32位機器。

在這裡,解釋一下虛函式表(virtual table 或稱為vtbl),虛函式指標( virtual pointer 或者稱為 vptr)的內部工作原理。

首先,我們必須了解一下記憶體布局。

例一:類的記憶體布局

#include 

using

namespace

std;

class test;

int main()

輸出結果:

sobj's size = 8

obj 's address = 0012ff7c

注意:任何的成員函式都不會占用任何的記憶體。

例二 :派生類的記憶體布局

// 父類

class test;

// 派生類

class dtest : public test;

int main()

輸出結果:

obj1's size = 8

obj1's address = 0012ff78

obj2's size = 12

obj2's address = 0012ff6c

例三 : 帶有虛函式類的記憶體布局

// 帶有虛函式的類

class test

};int main()

輸出結果:

obj's size = 8

obj's address = 0012ff7c

注意:在類中新增虛函式會產生額外的負擔(4byte)

例四:不止乙個虛函式

class test

virtual

void fun2()

virtual

void fun3()

virtual

void fun4()

};int main()

輸出結果:

obj's size = 8

obj's address = 0012ff7c

注意:如果乙個類中有虛函式的前提下,再增加虛函式就不會產生額外的記憶體負擔。仍然產生額外的4byte負擔。

例五:

class test

int geta()

int getb()

virtual ~test();

};int main()

輸出結果:

a = 200

b = 10

如果作如下修改:

// changing a and b

int* pint = (int*)&obj;

*(pint+1) = 100; // in place of 0

*(pint+2) = 200; // in place of 1

輸出結果:

a = 100

b = 200

注意:位於class第一位置是vptr,其他都位於其後面。

(who sits 1st place of class : answer is vptr,vptr - 1st placed in class and rest sits after it. )

例六:

class test 

};int main()

輸出結果:

vptr's address 0012ff7c

vptr's value 0046c060

例七:

class test

};typedef

void (*fun)(void);

int main()

輸出結果:

vptr's address 0012ff7c

virtual table 's address 0046c0ec

value at first entry of virtual table 0040100a

test: fun1

例八:

class test

virtual

void func1()

};int main()

輸出結果:

vptr's address 0012ff7c

virtual table 's address 0046c0ec

value at first entry of virtual table 0040100a

value at 2nd entry of virtual table 004012

例九:

class test

virtual

void func1()

};typedef

void(*fun)(void);

int main()

輸出結果:

test::fun1

test::func1

例十:

class base1;

class base2;

class base3;

class derive : public base1, public base2, public base3;

int main()

輸出結果:

derive's size = 12
例十一:

class base1

virtual

void func1()

};class base2

virtual

void func1()

};class base3

virtual

void func1()

};class derive : public base1, public base2, public base3

virtual

void fnc()

};typedef

void(*fun)(void);

int main()

輸出結果:

base1::fun

base1::func

base2::fun

base2::func

base3::fun

base3::func

drive::fn

drive::fnc

順便提一下函式指標:

int i;

定義了乙個int型別的變數i;

而這樣

typedef int int;

表示使用者自己定義了乙個整型資料型別int,實際上就等同於int

所以:int ii;

同上,表示定義了乙個int型別的變數ii;

同理可得:

typedef void (*fun)(void);

表示使用者自己定義了乙個函式指標資料型別 ,該函式指標指向 類似void foo(void)函式的函式入口位址

fun pf;

表示定義了乙個函式指標pf,該函式指標指向類似於void *pf(void)的函式 //leo

虛函式(繼承,多型中的理解,vptr和vtbl)

繼承和虛函式 物件模型 關於vptr和vtbl 侯捷大神的課程 講的巨tm好!有一定難度,但是很精彩,c 學習的小夥伴一定要看!我們知道,如果子類繼承了父類,那麼子類是能夠繼承父類的所有資料的 如果繼承限制允許 繼承中使用虛函式 不是虛函式 這樣的函式在父類中已經設計好,而且是不想要子類繼承的 不純...

vtbl(虛函式表)與vptr(虛函式表指標)

類的虛函式表是一塊連續的記憶體,每個記憶體單元中記錄乙個jmp指令的位址 注意的是,編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛成員佔據虛函式表中的一行。如果類中有n個虛函式,那麼其虛函式表將有n 4位元組的大小。虛函式 virtual function ...

多型性 vptr和vtable

多型性 polymorphi 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base typedef void fun 它與base中的三個虛函式相似,...