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

时间:2017-12-01 10:57:29

标签: c++ constructor

我有这样的事情:

providers: [
  { provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptor, multi: true }
]

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

我认为是这样的:

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 ...
  }
}

这在C ++ / 11中是否可行?

2 个答案:

答案 0 :(得分:4)

如果B的构造函数中没有代码发生,并且您只是希望以A构造方式允许其构造,则可以继承 A的构造函数:

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

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

如果正如编辑后的问题所说,B的构造函数不为空,那么您仍然可以获得所有A以及更多其他内容。使用" catch-all"以通用(但不是很好)的方式完美转发的构造函数:

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

请注意,这会相对于类型特征稍微改变B的行为。它现在似乎可以从任何东西构造,但使用不正确的参数将无法编译。如果您还需要该类与构造性检测特征等良好匹配,则可以使用SFINAE有条件地禁用不正确的实例化。

答案 1 :(得分:1)

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

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

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