繼承構造函數

在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,因此以上代碼還沒法編譯。編譯

相關文章
相關標籤/搜索