C++11之继承构造函数
2017-12-08 12:06
183 查看
问题场景
类的继承中,如果子类想使用父类的构造函数,则需要在子类的构造函数中声明使用父类的构造函数,例子如下:struct A { A(int i){} }; struct B:A { B(int i):A(i),d(i){} int d; };
但是如果父类中含有多种版本的构造函数,那么子类的构造函数需要多种版本的实现,实现起来很不方便。如下例子:
struct A { A(int i) {} A(double d,int i){} A(float f,int i,const char* c){} //...等等系列的构造函数版本号 }; struct B:A { B(int i):A(i){} B(double d,int i):A(d,i){} B(folat f,int i,const char* c):A(f,i,e){} //......等等好多个和基类构造函数相应的构造函数 };
解决方法
通过使用using方式来解决这个问题。方式如下:struct A { A(int i) {} A(double d,int i){} A(float f,int i,const char* c){} //...等等系列的构造函数版本号 }; struct B:A { using A::A; //关于基类各构造函数的继承一句话搞定 //...... }; int main() { B b(356);//使用方式 }
这样会降低开发者的开发成本,使用起来更加的方便一些。
注意事项
对于继承构造函数来说,参数的默认值是不会被继承的,并且,默认值会导致基类产生多个构造函数版本号(即参数从后一直往前面减。直到包括无參构造函数,当然假设是默认复制构造函数也包括在内),这些函数版本号都会被派生类继承。当派生类拥有多个基类时,多个基类中的部分构造函数可能导致派生类中的继承构造函数的函数名。例如:
struct A { A(int){} }; struct B { B(int){} }; struct C:A,B { using A::A; using B::B; };
上述代码中的A和B的构造函数会导致C中会重复定义相同类型的继承构造函数。
假设基类的构造函数被声明为私有构造函数或者派生类是从基类虚继承的,那么就不能在派生类中声明继承构造函数。
假设一旦使用了继承构造函数,编译器就不会为派生类生成默认构造函数。
相关文章推荐
- C++11新特性学习笔记—继承构造函数的使用
- C++11初窥二: 继承构造函数和委派构造函数
- C++11中的继承构造函数
- C++11 FAQ中文版:继承的构造函数
- C++11中的继承构造函数
- C++11 FAQ中文版:继承的构造函数
- C++11特性(3):继承构造函数和委派构造函数
- 关于C++子类在继承父类的构造函数时的一些情况
- javascript中继承(二)-----借用构造函数继承的个人理解
- Javascript面向对象编程(二) 构造函数的继承
- 【笔记】封装可使用的构造函数继承
- C++学习笔记18,C++11中的初始化列表构造函数(二)
- 多重继承,虚继承,MI继承中虚继承中构造函数的调用情况
- java中子类继承父类时是否继承构造函数
- Javascript 面向对象编程(一):封装/构造函数的继承/非构造函数的继承
- 基于继承的设计与构造函数和析构函数的开销之间的关系
- Java 构造函数不可以继承,因此不能被重写,但可以被重载
- 派生类构造函数举例(多继承、含有内嵌对象)
- C++ 虚继承对基类构造函数调用顺序的影响
- Javascript面向对象编程(三):非构造函数的继承