繁体   English   中英

用相同的参数调用基类的C ++构造函数

[英]Call C++ constructor of base class with same arguments

我有这样的事情:

class A {
public:
  A(int a1,int a2,int a3) {
  }
}
class B: public A {
public:
  B(int a1,int a2,int a3) : A(a1,a2,a3) { 
     .. Do Some More Init for B ...
  }
}

是否可以用较短的形式编写构造函数? 基类的构造函数应使用相同的参数调用。 但是我不想明确列出所有参数。 我需要为B类做一些特殊的初始化工作。

我认为是这样的:

class B: public A {
public:
  B(int a1,int a2,int a3) : A(...AUTOARG...) { 
    .. Do Some More Init for B ...
  }
}

在C ++ / 11中可能吗?

如果B的构造函数内没有代码发生,并且您只想以A可以构造的相同方式允许其构造,则可以继承 A的构造函数:

class B: public A {
public:
  using A::A;
};

这将为B提供与A相同的所有构造函数。

如所编辑的问题所述,如果B的构造函数不为空,则仍可以使用具有完美转发功能的“包罗万象”构造函数以通用(但效果不佳)的方式获得“全部完成A功能,再加上更多的功能” :

class B: public A {
public:
  template <class... Arg>
  B(Arg&&... arg) : A(std::forward<Arg>(arg)...) { 
     //.. Do Some More Init for B ...
  }
}

请注意,就类型特征而言,这会稍微改变B的行为。 现在看来可以用任何东西构造,但是使用不正确的参数将无法编译。 如果您还需要该类在可构造性检测特性等方面发挥出色的作用 ,则可以使用SFINAE有条件地禁用不正确的实例化。

更好的是, 继承构造函数。 这是C ++ 11的新功能:

class B: public A {
public:
  using A::A;
};

但是,不幸的是,如果您希望B构造函数执行其他操作,那么您将需要像现在这样将其写出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM