C 虛函式與虛函式表

2021-09-06 16:35:34 字數 2374 閱讀 5726

多型性可分為兩類:靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。

每個含有虛函式的類有一張虛函式表(vtbl),表中每一項是乙個虛函式的位址, 也就是說,虛函式表的每一項是乙個虛函式的指標。

沒有虛函式的c++類,是不會有虛函式表的。

兩張圖:

簡單例子:

1 #include 2 #include 3 

4 using namespace std;

5 6 class base

7 10

11 virtual void g()

12

13 virtual void h()

14

15

16

17 };

18

19 class base2

24

25 virtual void g()

26

27 virtual void h()

28

29 };

30

31

32 class base3

37

38 virtual void g()

39

40 virtual void h()

41

42 };

43

44

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

50

51 virtual void g1()

52

53 };

54

55

56 typedef void(*fun)(void);

57

58 int main()

59 60 {

61

62 fun pfun = null;

63

64 derive d;

65

66 int** pvtab = (int**)&d;

67

68 //base1's vtable

69

70 //pfun = (fun)*((int*)*(int*)((int*)&d+0)+0);

71

72 pfun = (fun)pvtab[0][0];

73

74 pfun();

75

76 77 //pfun = (fun)*((int*)*(int*)((int*)&d+0)+1);

78

79 pfun = (fun)pvtab[0][1];

80

81 pfun();

82

83 84 //pfun = (fun)*((int*)*(int*)((int*)&d+0)+2);

85

86 pfun = (fun)pvtab[0][2];

87

88 pfun();

89

90 91 //derive's vtable

92

93 //pfun = (fun)*((int*)*(int*)((int*)&d+0)+3);

94

95 pfun = (fun)pvtab[0][3];

96

97 pfun();

98

99

100 //the tail of the vtable

101

102 pfun = (fun)pvtab[0][4];

103

104 cout<

C 虛函式與虛函式表

概念 虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的,簡稱為v table。學習虛函式的作用 理解 c 實現多型的機制 解決了繼承 覆蓋的問題。以下摘抄自 http www.cppblog.com xczhang archive 2008 01 2...

C 虛函式與虛函式表

1 多型是c 三大特性之一,也是物件導向設計中乙個非常重要的概念。所謂多型性就是當 不同的物件接收到相同的訊息時所產生的不同的響應。c 中虛函式的存在其實就是為了解決物件導向程式設計設計當中的多型問題,即通過基類的指標 或者是引用 指向例項化 的派生類物件,從而通過基類的指標 或者是引用 呼叫派生類...

虛函式與虛函式表

當類中有虛函式時,類的大小會多4個位元組 多出的這4個位元組是乙個位址,指向一張表,裡面儲存了所有虛函式的位址 虛函式表 class base virtual void function 2 virtual void function 3 class sub public base virtual ...