C++學習之虛函數繼承和虛繼承


虛函數的定義要遵循以下重要規則:   

  1.如果虛函數在基類與派生類中出現,僅僅是名字相同,而形式參數不同,或者是返回類型不同,那么即使加上了virtual關鍵字,也是不會進行晚綁定的。

  2.只有類的成員函數才能說明為虛函數,因為虛函數僅適合用與有繼承關系的類對象,所以普通函數不能說明為虛函數。   

  3.靜態成員函數不能是虛函數,因為靜態成員函數的特點是不受限制於某個對象。   

  4.內聯(inline)函數不能是虛函數,因為內聯函數不能在運行中動態確定位置。即使虛函數在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非內聯的。   

  5.構造函數不能是虛函數,因為構造的時候,對象還是一片未定型的空間,只有構造完成后,對象才是具體類的實例。   

  6.析構函數可以是虛函數,而且通常聲明為虛函數。

在一個有虛函數的類中,編譯器會設立一個虛函數表(虛表)用來記錄對應的虛函數地址。每個地址對應一個虛指針,指針的大小為4個字節(編譯器一般以4的倍數對其地址)。虛表為順序存儲。在類的實例對象中,會有一個虛表指針,用來指向虛表。

虛繼承 是為了解決多重繼承而設計的,避免重復拷貝。如下:
qq截圖20141117230927.png
圖(a),(b),(c)表示B繼承自A,C繼承自A,D繼承自B和C,那么因為B和C都繼承自A,因此會出現d的情況,在類D中會出現兩個A,出現了重復拷貝,為了節省空間,可將B,C對A的繼承定義為虛繼承,A則成為虛基類,則繼承圖便成為圖(e)。
代碼如下:

【代碼】

1
2
3
4
class A;
class B: public virtual A;  //定義成虛繼承
class C: public virtual A;  //定義成虛繼承
class D: public B, public C; //只會出現一個A

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM