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:沒有合適的構(gòu)造函數(shù)return 0; }以上示例就是說,如果有一個派生類,希望能和基類一樣采取相同的構(gòu)造方式,其直接派生于基類是不能獲取基類構(gòu)造函數(shù)的,因?yàn)?#xff0c;C++派生類會隱藏基類同名函數(shù)。
所以Derived d(1,3.2,“hello”);調(diào)用會直接報(bào)錯,因?yàn)榕缮惖哪J(rèn)構(gòu)造函數(shù)隱藏了積累。如果希望使用基類的構(gòu)造函數(shù),一個可行的 方法就是在派生類中也定義這些構(gòu)造函數(shù)并依次調(diào)用基類。
如下:
繼承構(gòu)造函數(shù)
以上方法雖然可行,但是代碼非常繁瑣切重復(fù)性高,而C++11中的繼承構(gòu)造函數(shù)特征正是用于解決派生類隱藏基類同名函數(shù)的問題。
可以通過 using Base::SomeFunction來表示使用基類的同名函數(shù)。 所以以上示例,通過 using Base::Base;來聲明使用基類的構(gòu)造函數(shù),就可以在派生類中不用定義相同的構(gòu)造函數(shù)了,直接使用基類的構(gòu)造函數(shù)來構(gòu)造派生類對象。
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; //聲明使用基類的構(gòu)造函數(shù) }; int main() {Derived d1(1);Derived d2(1,3.2);Derived d3(1,3.2,"hello");return 0; }需要注意的是,繼承構(gòu)造函數(shù)不會去初始化派生類新定義的數(shù)據(jù)成員。
考慮一種情況,如果通過 using Base::Base;來聲明使用基類的構(gòu)造函數(shù),但是同時(shí)又在派生類中定義相同構(gòu)造函數(shù),會出現(xiàn)什么結(jié)果。
如下示例:
輸出結(jié)果:
this is Base. this is Derived.也就是說,如果通過 using Base::Base;來聲明使用基類的構(gòu)造函數(shù),但是同時(shí)又在派生類中定義相同構(gòu)造函數(shù),這時(shí)候調(diào)用Derived d3(1,3.2,“hello”);, 產(chǎn)生的結(jié)果是,會直接調(diào)用派生類中的構(gòu)造函數(shù)。
該特性不僅對構(gòu)造函數(shù)有用,對其他同名函數(shù)也適用。
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; }以上示例,會輸出結(jié)果 call in Derived Fun,因?yàn)榕缮愔械膄un函數(shù)隱藏了基類中的函數(shù),如果派生類中沒有定義fun,那么無法從派生類對象調(diào)用基類的fun函數(shù),這時(shí)候可以定義 using Base::fun; 然后就可以調(diào)用啦。
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; }總結(jié)
以上是生活随笔為你收集整理的C++11:继承构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11:委托构造函数
- 下一篇: ubuntu c++ 实现自动回车键功能