有虛函數的類內部有一個稱為“虛表”的指針(有多少個虛函數就有多少個指針),這個就是用來指向這個類虛函數。也就是用它來確定調用該那個函數。
例如:
[cpp]
1. #include <iostream>
2. using namespace std;
3.
4. class A{
5. public:
6. virtual void fun1(){
7. cout << "In class A::fun1()!" << endl;
8. }
9.
10. virtual void fun2(){
11. cout << "In class A::fun2()!" << endl;
12. }
13.
14. void fun3(){
15. cout << "In class A::fun3()!" << endl;
16. }
17. ~A(){
18. cout << "A destroy!" << endl;
19. }
20. };
21.
22. class B : public A{
23. public:
24. void fun2(){
25. cout << "In class B::fun2()!" << endl;
26. }
27.
28. void fun3(){
29. cout << "In class B::fun3()!" << endl;
30. }
31. ~B(){
32. cout << "B destroy!" << endl;
33. }
34. };
35.
36. int main(){
37. A a;
38. B b;
39. a.fun1();
40. a.fun2();
41. a.fun3();
42.
43. cout << endl;
44. A *a1 = new A;
45. a1 = &b;
46. a1->fun1();
47. a1->fun2();
48. a1->fun3();
49. cout << endl;
50. b.fun1();
51. b.fun2();
52. b.fun3();
53. cout << endl;
54. return 0;
55. }
實際上在編譯的時候,編譯器會自動加入“虛表”。虛表的使用方法是這樣的:如果派生類在自己的定義中沒有修改基類的虛函數,就指向基類的虛函數;如果派生類改寫了基類的虛函數(就是自己重新定義),這時虛表則將原來指向基類的虛函數的地址替換為指向自身虛函數的指針。這時若像下面這樣:
摘自 w397090770