在C++的繼承關係中,只有虛函數能夠被繼承,而構造函數不能夠是虛函數,因此構造函數不能被繼承,可是能夠經過某種特殊手段,達到繼承的效果。ios
先看看C++中using關鍵字的一個應用 函數
1 #include <iostream> 2 using namespace std; 3 4 struct Base { 5 void f(double i) {cout << "Base: " << i << endl;} 6 }; 7 8 struct Derived : Base { 9 using Base::f; 10 void f(int i) {cout << "Derived: " << i << endl;} 11 }; 12 13 int main() { 14 Base b; 15 b.f(4.5); 16 Derived d; 17 d.f(4.5); 18 }
打印結果以下:spa
第9行和第10行爲Derived類定義了兩個版本的f函數,無論你知道或是不知道,奇怪或是不奇怪,結果就是這樣,這就是using關鍵字的一個小應用。code
而C++11利用using關鍵字這一特色,是構造函數能夠被「繼承」。blog
1 struct A { 2 A(int i){} 3 A(double d, int i){} 4 A(float f, int i, const char* c){} 5 }; 6 7 struct B:A { 8 using A::A; 9 int d{0}; 10 }; 11 12 int main() { 13 B b(217); // b.d被初始化爲0,這是C++11的變量初始化 14 //B b1; // 使用繼承構造函數的類,編譯器不會爲其生成默認構造函數 15 }
使用繼承構造函數特性有一些須要注意的地方:繼承
1. 若是基類的構造函數被聲明爲私有函數,或者派生類是從基類虛繼承的,那麼就不能使用繼承構造函數。編譯器
2. 若是一個類使用了繼承構造函數,那麼編譯器將不會爲其生成默認的構造函數。io
繼承構造函數的特性聽說要到g++ 4.8纔會被支持,可是個人版本是4.7,因此以上代碼還沒法編譯。編譯