----你的人生不會辜負你的。那轉錯的彎,流下的淚水,滴下的汗水,全都讓你成為獨一無二的自己。只是努力了一陣子,但一遇到困難就各種憂傷,好像自己努力了很久一樣。
繼承構造
在繼承體系中,假設派生類想要使用基類的建構函式,必須要在建構函式中顯式宣告。
舉個小例子:
那麼它解決了什麼問題呢?看看下面的小問題:class base
base(int value) : base()
};
class subclass : public base ;
在這裡,b派生於a,bstruct a
};
struct b:a
};
又在建構函式中呼叫a的建構函式。從而完畢建構函式的傳遞。
又比方例如以下。當b中存在成員變數時:
如今派生於a的結構體b包括乙個成員變數,我們在初始化基類a的同一時候也初始化成員d。如今的問題是:假若基類用於擁有為數眾多的不同版本號的建構函式。這樣,在派生類中按上面的思維還得寫非常多相應的"透傳"建構函式。例如以下:struct a
};
struct b:a
int d;
};
非常明顯當基類建構函式一多,派生類建構函式的寫法就顯得非常累贅,相當不方便。struct a
a(double d,int i){}
a(float f,int i,const char* c){}
//...等等系列的建構函式版本號
};
struct b:a
b(double d,int i):a(d,i){}
b(folat f,int i,const char* c):a(f,i,e){}
//......等等好多個和基類建構函式相應的建構函式
};
問題的解決
我們能夠通過using宣告來完畢這個問題的簡化,看乙個樣例
如今,通過using a::a的宣告。將基類中的建構函式全繼承到派生類中,更巧妙的是,這是隱式宣告繼承的。即假設乙個繼承建構函式不被相關的**使用,編譯器不會為之產生真正的函式**,這樣比透傳基類各種建構函式更加節省目標**空間。但此時另乙個問題:struct base
a(double d,int i){}
a(float f,int i,const char* c){}
//...等等系列的建構函式版本號
};
struct b:a
;
當使用using語句繼承基類建構函式時。派生類無法對類自身定義的新的類成員進行初始化,我們可使用類成員的初始化表示式,為派生類成員設定乙個預設初始值。比方:
注意:1.對於繼承建構函式來說,引數的預設值是不會被繼承的,並且,預設值會 導致基類產生多個建構函式版本號(即引數從後一直往前面減。直到包括無參建構函式,當然假設是預設複製建構函式也包括在內),這些函式版本號都會被派生類繼承。struct a
a(double d,int i){}
a(float f,int i,const char* c){}
//...等等系列的建構函式版本號
};
struct b:a
;
};
2.繼承建構函式中的衝突處理:當派生類擁有多個基類時,多個基類中的部分建構函式可能導致派生類中的繼承建構函式的函式引數都同樣,那麼繼承類中的繼承建構函式將導致不合法的派生類**,比方:
在這裡將導致派生類中的繼承建構函式發生衝突,乙個解決的辦法就是顯式指定繼承類的衝突建構函式。阻止隱式生成對應的繼承建構函式,以免發生衝突。struct a
};
struct b
};
struct c:a,b;
3.假設基類的建構函式被宣告為私有建構函式或者派生類是從基類虛繼承的,那麼就不能在派生類中宣告繼承建構函式。struct c:a,b
};
4.假設一旦使用了繼承建構函式,編譯器就不會為派生類生成預設建構函式。這樣,我們得注意繼承建構函式無參版本號是不是有必要。
c 11 繼承構造
define crt secure no warnings include include include include c 11允許派生類繼承基類的建構函式 預設建構函式 複製建構函式 移動建構函式除外 注意 繼承的建構函式只能初始化基類中的成員變數,不能初始化派生類的成員變數 如果基類的建構函...
C 11 繼承建構函式
繼承建構函式 基類有多個不同版本的建構函式,子類必須對應建構函式來進行 透傳 如 class base base double d,int i void fun float d class derived public base derived double d,int i base d,i voi...
走進C 11(十七)
是的你沒看錯,今天的題目就是 這。有啥好講的?其實經常用模板的人可能一不小心都吃過這個虧。對於c 程式設計師來說,是位右移操作符,但在一此應用中會涉及到需要連寫的情景,例如 模板和表示式轉換。在例項化模板時會出現連續兩個右尖括號,同樣static cast dynamic cast reinterp...