C++11之继承构造函数

问题场景

类的继承中,如果子类想使用父类的构造函数,则需要在子类的构造函数中声明使用父类的构造函数,例子如下:

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);//使用方式
}

这样会降低开发者的开发成本,使用起来更加的方便一些。

注意事项

  1. 对于继承构造函数来说,参数的默认值是不会被继承的,并且,默认值会导致基类产生多个构造函数版本号(即参数从后一直往前面减。直到包括无參构造函数,当然假设是默认复制构造函数也包括在内),这些函数版本号都会被派生类继承。
  2. 当派生类拥有多个基类时,多个基类中的部分构造函数可能导致派生类中的继承构造函数的函数名。例如:

    struct A
    {
    A(int){}
    };
    struct B
    {
    B(int){}
    };
    struct C:A,B
    {
    using A::A;
    using B::B;
    };

    上述代码中的A和B的构造函数会导致C中会重复定义相同类型的继承构造函数。

  3. 假设基类的构造函数被声明为私有构造函数或者派生类是从基类虚继承的,那么就不能在派生类中声明继承构造函数。

  4. 假设一旦使用了继承构造函数,编译器就不会为派生类生成默认构造函数。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值