我有这个示例代码:
#include <iostream>
class A
{
public:
A()
{
std::cout << "Default constructor of A" << '\n';
}
A(int i)
{
std::cout << "Inside the constructor of A with one int argument" << '\n';
}
A(double i)
{
std::cout << "Inside the constructor of A with one double argument" << '\n';
}
};
class B : A
{
using A::A;
public:
B()
{
std::cout << "Default constructor of B" << '\n';
}
};
int main()
{
B b(12);
std::cout << "End of main";
}
输出是:
Inside the constructor of A with one int argument
End of main
我理解为什么B
不调用 s 构造函数(请参阅C++ 中的构造函数继承。派生类的默认构造函数未被调用)并且我可以编写 a B(int)
,但问题是它A
有很多构造函数,并且在构造 a 时我希望调用B
相应的构造函数并且一个特定的构造函数。A
B
如何在不B
为每个A
构造函数编写一个构造函数的情况下实现这一目标?
换句话说,我希望的输出B b(12)
是
Inside the constructor of A with one int argument
Default constructor of B
End of main
并且还要B b(4.2)
成为
Inside the constructor of A with one double argument
Default constructor of B
End of main
B
无需多次重写构造函数。
一种解决方案是在派生类中使用转发构造函数,将所有参数转发到基类。那会给你
当使用时
输出
正如这个实例所示。
这确实有一个警告,即模板不会发生隐式转换,因此如果您尝试使用
因为
A
可以用向量来构造,那么这将无法编译,因为{foo, bar, baz}
没有类型。B
您可以添加额外的基础/成员来完成这项工作,而不是直接在 中完成工作:然后要么
或者
演示