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(顯示的不完全),在調試模式下: 2、virtual繼承 虛繼承是在多重繼承中引入的一種技術,關於虛繼承的分析討論不是本文的重點,不了解的同學可以查看相關的c++書籍,下面要講的是virtual中的虛函數。 1 class base1 2 { 3 public: 4 virtual void f(){} 5 }; 6 class base2 7 { 8 public: 9 virtual void g(){} 10 }; 11 class derive1:virtual public base1 12 { 13 public: 14 virtual void f(){} 15 virtual void f1(){} 16 } 17 class derive2:virtual public base1,virtual public base2 18 { 19 public: 20 virtual void f(){} 21 virtual void g(){} 22 virtual void g1(){} 23 }; View Code
通過vs2013查看虛函數表如下: 本文參考了知名技術博主左耳朵耗子在csdn上的博客, 博客地址為:http://blog.csdn.net/haoel/article/details/1948051 歡迎大家來討論交流,歡迎轉載,切勿用於商業用途,版權所有,轉載必須注明出處。