1. 程式人生 > >C++ 多重繼承 虛繼承 虛擬函式表 多型

C++ 多重繼承 虛繼承 虛擬函式表 多型

C++中的多重繼承和虛繼承是一個非常重要的概念,也是看你是不是懂C++的一個重要的標誌之一。這中間包括了執行時多型,虛擬函式表等等相關概念。
多重繼承,顧名思義,是一個類繼承了多個父類。例如class C:public A, publicB{};這樣就是一個多重繼承。
首先看看多重繼承的構造和解構函式。
多重繼承的建構函式是先執行父類中的建構函式在執行自己的建構函式,多個父類按照繼承順序來。上面的例子就是先A再B最後C。析構正好相反。
可以顯示的在初始化列表中進行構造,也可以不寫隱式呼叫父類的建構函式。例如C():A(),B(){}這樣就是顯示的。C():B(){}這樣就是隱式的呼叫A建構函式,顯示呼叫B的構造函數了。


執行時多型就是用父類的指標指向子類的物件,呼叫子類中的函式。在執行時決定呼叫哪一個函式。執行時多型是與靜態多型不同的,靜態多型就是函式的過載。
接下來說一下虛繼承。虛繼承是解決多重繼承中的一個非常常見的問題:菱形繼承問題。即基類是A,B和C分別繼承A,D多重繼承B和C。D在建構函式的時候就執行了兩個A的建構函式。所以會出現錯誤的。這個時候就用到了虛繼承。
虛繼承的用法是這樣的:虛繼承的類就叫做虛基類。 A就是是虛基類,B和C虛繼承A,D中只有一個A物件。
class A{
};
class B:public virtual A{


};
class C:virtual public A{//virtual與public的順序都可以的


};
class D:public B, public C{


}; 
最後注意,虛基類總是鹹魚非虛基類構造的,與繼承的順序是沒有關係的。


還要說的就是虛擬函式表V-Table的問題。虛擬函式表是執行時多型的根本上的保障。虛擬函式是一個類如果它包含虛擬函式,則該類就會在記憶體中建立這樣一個虛擬函式表。在執行時,根據虛擬函式表決定呼叫哪一個函式。
一個類如果包含虛擬函式,則它的地址中有4位是虛擬函式表地址的指標。虛擬函式表示一塊連續的記憶體。為每一個父類(有虛擬函式)都會有一個虛擬函式表。多重繼承中,子類的函式放在第一個虛擬函式表內。詳情請看這個連結,他這個將的就非常全面。
http://blog.csdn.net/haoel/article/details/1948051/