c++是一種面向對象的編程語言的一個很明顯的體現就是對繼承機制的支持,c++中繼承分很多種,按不同的分類有不同分類方法,比如可以按照基類的個數分為多繼承和單繼承,可以按照訪問權限分為public繼承、protected繼承和private繼承,按照是否是虛擬繼承可以分為virtual繼承和non-virtual繼承。當然這裡的分類標准都是有重疊的部分,比如,non-virtual繼承又可以分為單繼承和多繼承。這裡要討論的是虛函數,因此主要從virtual和non-virtual繼承兩個方面來展開討論分析。
1、non-virtual繼承 non-virtual繼承又有兩種情況單繼承和多繼承。來看一個例子:1 class base1 2 { 3 public: 4 virtual void f(){} 5 virtual void h(){} 6 }; 7 class base2 8 { 9 public: 10 virtual void g(){} 11 }; 12 class derive1:public base1 13 { 14 public: 15 virtual void f(){} 16 virtual void f1(){} 17 } 18 class derive2:public base1,public base2 19 { 20 public: 21 virtual void f(){} 22 virtual void g(){} 23 virtual void g1(){} 24 };
建立四個對象: base1 b1; base2 b2; derive1 d1; derive2 d2; 學習c++的都知道裡面的虛函數表,上面的繼承體系中各個類的虛函數表如下: base1的虛函數表如下: vptr-->base1::f base1::h//vptr為指向類的虛函數表的指針,-->表示的意思是指向一個表,後面的內容是表中的內容 base2的虛函數表如下: vptr-->base2::g // derive1的虛函數表如下: vptr-->derive1::f base1::h derive1::f derive2的虛函數表如下: vptr1-->derive2::f base1::h derive2::g1 //base1 vptr2-->derive2::g //base2 在windows開發平台查看虛函數表如下:主機環境為 win7+vs2013(顯示的不完全),在調試模式下:
通過vs2013查看虛函數表如下: