C 虛繼承派生類建構函式的寫法

2021-07-30 17:46:17 字數 2715 閱讀 8448

普通的繼承中,我們可以在當前類(c)建構函式的初始化表中指明如何去構造直接父類(b),然後在該父類(b)建構函式的初始化表中指明如何構造祖先類(a)。

class a

a(int d):data(d) {}

private:

int data;

};class b : public a

b(int x):a(x) {}

};class c : public b

c(int x):b(x) {}

};

這樣的寫法是正確的,在建立乙個 c 型別的例項時,程式會根據其建構函式的選擇以及引數化表層層找到最上層的類,然後依次往下執行建構函式進行初始化。

但是在繼承鏈中如果存在虛繼承的話或許就不是這樣了。

程式中有四個類:animal、aqu_animal、amp_animal、test

其中類之間的繼承關係如下,除test以外其他繼承都採用虛繼承的方式。

這裡還是按照原來的思路進行初始化的工作

#include 

#include

using

namespace

std;

class animal

;class test:public amp_animal

test(int h,int w,char s,int s_p,int r):amp_animal(h,w,s,s_p,r)

執行結果

animal()

aqu_animal()

amp_animal(int h,int w,char s,int s_p,int r)

test(int h,int w,char s,int s_p,int r)

----------------

height:4309616

weight:7012244

***:

swimming_speed:1978756045

running_speed:120

可以看到,除了running_speed正常外其他的變數都沒有被正常賦值。

在函式的呼叫中,我們發現test類中的test(int h,int w,char s,int s_p,int r)正常執行了,並且它所附帶的初始化表中的建構函式同樣也被執行了(amp_animal(int h,int w,char s,int s_p,int r))。

而在amp_animal類中利用amp_animal(int h,int w,char s,int s_p,int r)構造時的父類aqu_animal建構函式aqu_animal(int h,int w,char s,int s_p)並沒有被執行,同樣animal類中的animal(int h,int w,char s)也沒有被執行,實際上都是呼叫了它們預設的建構函式。

c++中,如果繼承鏈上存在虛繼承的基類,則最底層的子類要負責完成該虛基類部分成員的構造。

即我們需要顯式呼叫虛基類的建構函式來完成初始化,如果不顯式呼叫,則編譯器會呼叫虛基類的預設建構函式,若虛基類中沒有定義的預設建構函式,則會編譯錯誤。

因為如果不這樣做,虛基類部分會在存在的多個繼承鏈上被多次初始化。

很多時候,對於繼承鏈上的中間類,我們也會在其建構函式中顯式呼叫虛基類的建構函式,因為一旦有人要建立這些中間類的物件,我們要保證它們能夠得到正確的初始化。

#include 

#include

using

namespace

std;

class animal

;class test:public amp_animal

test(int h,int w,char s,int s_p,int r):amp_animal(h,w,s,s_p,r),aqu_animal(h,w,s,s_p),animal(h,w,s)

注意test的建構函式初始化表中我們顯式的呼叫了其間接父類的建構函式。執行結果

animal(int h,int w,char s)

aqu_animal(int h,int w,char s,int s_p)

amp_animal(int h,int w,char s,int s_p,int r)

test(int h,int w,char s,int s_p,int r)

----------------

height:50

weight:20

***:m

swimming_speed:100

running_speed:120

c 學習 繼承 派生類的建構函式

1.在派生類中,預設基類的建構函式是不被繼承的,派生類需要構造自己的建構函式。ps 在c 11中,定義可以使用using語句來繼承基類的建構函式。但它不能初始化派生類新增成員。2.派生類建構函式需要完成的任務 不繼承基類建構函式的情況 1 派生類新增成員 派生類定義建構函式初始化 2 繼承來的成員 ...

C 派生類建構函式

派生類構造函式呼叫順序 1.基類的建構函式.2.子物件類的建構函式.3.派生類建構函式.當物件被刪除時,派生類的析構函式被執行,由於析構函式也不能被繼承,因此在執行派生類的析構函式時,基類的析構函式也會被呼叫。先執行派生類的析構函式,再執行子物件類的析構函式,再執行基類的建構函式。include u...

C 派生類的建構函式

1,在使用建構函式的時候,作為派生類會有某些特殊問題。其根源就是建立派生類的時候會有多個建構函式起作用。2,c 中例項化的類的建構函式本身不能初始化類,還必須呼叫基類的建構函式。3,建構函式的呼叫順序是自上向下的,實際上是編譯器先自下而上的尋找建構函式,然後再自上而下的執行 直到達到要例項化的類為止...