分析了這兩種用法,真想吐槽兩句,這兩個特性確實有實際需要,但客觀來說,現有標準足夠用,而且帶來的代價也非常大,又給c++複雜的語法糖重重的抹了一筆!!!
一、繼承建構函式
繼承建構函式的引入原因:如果基類的建構函式很多,那麼子類的建構函式想要實現同樣多的構造介面,必須一一呼叫基類的建構函式,有點麻煩
於是乎:c++11引入繼承建構函式
class _a
_a( double _indouble, int _inint )
_a( float _infloat, int _inint, const char* _char )
};class _b : public _a
};
一句using _a::_a; 把基類中的建構函式都繼承到派生類_b中, 這樣最開始的那段**就可以擺脫基類那麼多建構函式介面了。
但是:(1) c++11中的繼承建構函式特性最有用的場合就是,派生類只是在基類的基礎上新增了幾個新的介面, 這個時候繼承建構函式最能夠展現威力.
但是缺陷就是, 繼承建構函式只會初始化基類中的成員變數(畢竟只是從基類繼承下來的), 對於派生類中的變數無能為力,
(2)不過,可以配合另乙個c++11中的新特性: 資料成員就地初始化,來解決這個問題。但是,這種做法導致子類的成員不能在建構函式的引數列表中體現出來。
(3)一旦,子類繼承了基類的建構函式,那麼子類就不會自動生成預設建構函式。
struct _base
};struct _derived : _base
;int main( int _argc, char* *_argv )
所以,如果子類新增了自己的成員變數,乖乖回到以前的初始化列表方法中吧。
二、委派建構函式
託建構函式允許類中的乙個建構函式通過初始化列表方式來呼叫同乙個類中的另乙個建構函式。
class info
info(int i) : info(i, 'a')
info(char e): info(1, e)
private:
info(int i, char e): type(i), name(e)
int type;
char name;
// ...
};
是減少冗餘**和重複**的好辦法,能提高**的可讀性。
但是,不要形成委託環
struct rule2
rule2(int i): rule2('c') {}
rule2(char c): rule2(2) {}
};rule2定義中,rule2()、rule2(int)和rule2(char)都依賴於別的建構函式,形成環委託構造關係。這樣的**通常會導致編譯錯誤
C 11中繼承建構函式和委派建構函式
1 繼承建構函式 在c 繼承中,我們可能會遇到下面這個例子 class base base char c m c c private int m value char m c class derived public base 那麼如果我們在構造b的時候想要擁有a這樣的構造方法的話,就必須乙個乙個的...
C 11 委派建構函式
一 委派建構函式 深入理解c 11 委派構造 就是指委派函式將構造的任務派給了目標建構函式來完成這樣一種類構造的方式。c 11中的委派建構函式是在建構函式的初始化列表位置進行構造的 委派的 基準版本 的建構函式稱為目標建構函式,呼叫 基準版本 的建構函式稱為委派建構函式 舉例 namespace d...
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...