程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++虛函數簡介

C++虛函數簡介

編輯:C++入門知識

有虛函數的類內部有一個稱為“虛表”的指針(有多少個虛函數就有多少個指針),這個就是用來指向這個類虛函數。也就是用它來確定調用該那個函數。
例如:
[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
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved