C++11:继承构造函数
前言
首先我們來看一種情況,有如下示例:
class Base { public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){}private:int x;double y;string s; };class Derived : Base {};int main() {Derived d(1,3.2,"hello"); //error:沒有合適的構造函數return 0; }以上示例就是說,如果有一個派生類,希望能和基類一樣采取相同的構造方式,其直接派生于基類是不能獲取基類構造函數的,因為,C++派生類會隱藏基類同名函數。
所以Derived d(1,3.2,“hello”);調用會直接報錯,因為派生類的默認構造函數隱藏了積累。如果希望使用基類的構造函數,一個可行的 方法就是在派生類中也定義這些構造函數并依次調用基類。
如下:
繼承構造函數
以上方法雖然可行,但是代碼非常繁瑣切重復性高,而C++11中的繼承構造函數特征正是用于解決派生類隱藏基類同名函數的問題。
可以通過 using Base::SomeFunction來表示使用基類的同名函數。 所以以上示例,通過 using Base::Base;來聲明使用基類的構造函數,就可以在派生類中不用定義相同的構造函數了,直接使用基類的構造函數來構造派生類對象。
class Base { public:Base(int i):x(i),y(0){}Base(int i,double j):x(i),y(j){}Base(int i,double j,const string & str):x(i),y(j),s(str){}private:int x;double y;string s; };class Derived : Base { public:using Base::Base; //聲明使用基類的構造函數 }; int main() {Derived d1(1);Derived d2(1,3.2);Derived d3(1,3.2,"hello");return 0; }需要注意的是,繼承構造函數不會去初始化派生類新定義的數據成員。
考慮一種情況,如果通過 using Base::Base;來聲明使用基類的構造函數,但是同時又在派生類中定義相同構造函數,會出現什么結果。
如下示例:
輸出結果:
this is Base. this is Derived.也就是說,如果通過 using Base::Base;來聲明使用基類的構造函數,但是同時又在派生類中定義相同構造函數,這時候調用Derived d3(1,3.2,“hello”);, 產生的結果是,會直接調用派生類中的構造函數。
該特性不僅對構造函數有用,對其他同名函數也適用。
class Base { public:void fun(int a){cout << "call in Base Fun";} };class Derived : Base { public: // using Base::fun;void fun(int a){cout << "call in Derived Fun";} };int main() {Derived d1;d1.fun(4);return 0; }以上示例,會輸出結果 call in Derived Fun,因為派生類中的fun函數隱藏了基類中的函數,如果派生類中沒有定義fun,那么無法從派生類對象調用基類的fun函數,這時候可以定義 using Base::fun; 然后就可以調用啦。
class Base { public:void fun(int a){cout << "call in Base Fun";} };class Derived : Base { public:using Base::fun; };int main() {Derived d1;d1.fun(4);return 0; }總結
以上是生活随笔為你收集整理的C++11:继承构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11:委托构造函数
- 下一篇: ubuntu c++ 实现自动回车键功能