如何委托基类的不同构造函数并调用派生类构造函数?

for*_*818 1 c++ constructor

我有这个示例代码:

#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无需多次重写构造函数。

Nat*_*ica 5

一种解决方案是在派生类中使用转发构造函数,将所有参数转发到基类。那会给你

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}没有类型。