在虛繼承中,虛基類是由最終的派生類初始化的,換句話說,最終派生類的建構函式必須要呼叫虛基類的建構函式。對最終的派生類來說,虛基類是間接基類
,而不是直接基類。這跟普通繼承不同,在普通繼承中,派生類建構函式中只能呼叫直接基類的建構函式,不能呼叫間接基類的。
下面我們以菱形繼承為例來演示建構函式的呼叫:
#include
using namespace std;
//虛基類a
classa;
a::a(int a): m_a(a)
//直接派生類b
classb: virtual public a;
b::b(int a, int b): a(a), m_b(b)
void b::display()
//直接派生類c
classc: virtual public a;
c::c(int a, int c): a(a), m_c(c)
void c::display()
//間接派生類d
classd: public b, public c;
d::d(int a, int b, int c, int d): a(a), b(90, b), c(100, c), m_d(d)
void d::display()
int main()
:d::d(int a, int b, int c, int d): b(90, b), c(100, c), a(a), m_d(d)
雖然我們將 a() 放在了最後,但是編譯器仍然會先呼叫 a(),然後再呼叫 b()、c(),因為 a() 是虛基類的建構函式,比其他建構函式優先順序高。如果沒有使用虛繼承的話,那麼編譯器將按照出現的順序依次呼叫 b()、c()、a()。
C 虛繼承時的建構函式
在虛繼承中,虛基類是由最終的派生類初始化的,換句話說,最終派生類的建構函式必須要呼叫虛基類的建構函式。對最終的派生類來說,虛基類是間接基類,而不是直接基類。這跟普通繼承不同,在普通繼承中,派生類建構函式中只能呼叫直接基類的建構函式,不能呼叫間接基類的。下面我們以菱形繼承為例來演示建構函式的呼叫 in...
C 多繼承時的虛函式表結構
c 為了實現執行時的多型,引入了虛函式的概念。為了實現執行時多型的,其底層一般採用虛函式表來實現對虛函式的動態繫結,進而在基類物件的引用或指標在呼叫同名的虛函式時可以根據引用或指標指向物件的實際型別呼叫相應的函式。當類的繼承關係中沒有使用多繼承時,物件的虛函式表結構還相對簡單 然而繼承 現多整合時,...
虛函式 虛繼承 C
關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...