我有这个示例代码:
#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";
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Inside the constructor of A with one int argument
End of main
Run Code Online (Sandbox Code Playgroud)
我理解为什么B不调用 s 构造函数(请参阅C++ 中的构造函数继承。派生类的默认构造函数未被调用)并且我可以编写 a B(int),但问题是它A有很多构造函数,并且在构造 a 时我希望调用B相应的构造函数并且一个特定的构造函数。AB
如何在不B为每个A构造函数编写一个构造函数的情况下实现这一目标?
换句话说,我希望的输出B b(12)是
Inside the constructor of A with one int argument
Default constructor of B
End of main
Run Code Online (Sandbox Code Playgroud)
并且还要B b(4.2)成为
Inside the constructor of A with one double argument
Default constructor of B
End of main
Run Code Online (Sandbox Code Playgroud)
B无需多次重写构造函数。
一种解决方案是在派生类中使用转发构造函数,将所有参数转发到基类。那会给你
class B : A
{
public:
template <typename... Args>
B(Args&&... args) : A(std::forward<Args>(args)...)
{
std::cout << "Default constructor of B" << '\n';
}
};
Run Code Online (Sandbox Code Playgroud)
当使用时
int main()
{
B b(12);
std::cout << "End of main";
}
Run Code Online (Sandbox Code Playgroud)
输出
Inside the constructor of A with one int argument
Default constructor of B
End of main
Run Code Online (Sandbox Code Playgroud)
正如这个实例所示。
这确实有一个警告,即模板不会发生隐式转换,因此如果您尝试使用
B b({foo, bar, baz});
Run Code Online (Sandbox Code Playgroud)
因为A可以用向量来构造,那么这将无法编译,因为{foo, bar, baz}没有类型。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |