我有这样的事情:
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中是否可行?
答案 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
构造函数执行其他操作,那么您需要像目前那样将其写出来。