虛函數的定義要遵循以下重要規則:
1.如果虛函數在基類與派生類中出現,僅僅是名字相同,而形式參數不同,或者是返回類型不同,那么即使加上了virtual關鍵字,也是不會進行晚綁定的。
2.只有類的成員函數才能說明為虛函數,因為虛函數僅適合用與有繼承關系的類對象,所以普通函數不能說明為虛函數。
3.靜態成員函數不能是虛函數,因為靜態成員函數的特點是不受限制於某個對象。
4.內聯(inline)函數不能是虛函數,因為內聯函數不能在運行中動態確定位置。即使虛函數在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非內聯的。
5.構造函數不能是虛函數,因為構造的時候,對象還是一片未定型的空間,只有構造完成后,對象才是具體類的實例。
6.析構函數可以是虛函數,而且通常聲明為虛函數。
在一個有虛函數的類中,編譯器會設立一個虛函數表(虛表)用來記錄對應的虛函數地址。每個地址對應一個虛指針,指針的大小為4個字節(編譯器一般以4的倍數對其地址)。虛表為順序存儲。在類的實例對象中,會有一個虛表指針,用來指向虛表。
虛繼承
是為了解決多重繼承而設計的,避免重復拷貝。如下:

圖(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
|