C++ 即使派生类没有成员变量,我也需要重新实现基类的所有构造函数吗?

C++ 即使派生类没有成员变量,我也需要重新实现基类的所有构造函数吗?,c++,inheritance,constructor,C++,Inheritance,Constructor,假设我有一个基类 class Base { public: Base(); Base(int i, double j); Base(int i, double j, char ch); virtual void print(); private: int m; double l; char n; }; 我想派生一个覆盖print函数的类,但除此之外,它与基类完全相同 class Derived : public Base { publ

假设我有一个基类

class Base
{
public:
    Base();
    Base(int i, double j);
    Base(int i, double j, char ch);

    virtual void print();

private:
    int m;
    double l;
    char n;
};
我想派生一个覆盖print函数的类,但除此之外,它与基类完全相同

class Derived : public Base
{
public:
    void print();
};

是否有一种方法可以使用派生类上基类的所有构造函数,而不必为派生类重写所有构造函数?

自C++11以来,您可以使用
using
进行以下操作:

class Derived : public Base
{
public:
    using Base::Base; // use all constructors of base.

    void print() override;
};

您可以调用基类的构造函数。因此,如果您定义
Base
,如下所示

class Base
{
public:
    Base() {};
    Base(int i, double j) : m{i}, l{j} {};
    Base(int i, double j, char ch) : m{i}, l{j}, n{ch} {};

    virtual void print() { std::cout << "Base" << std::endl; };

private:
    int m;
    double l;
    char n;
};
例如

int main()
{
    Base b1{};
    Base b2{1, 2};
    Base b3{1, 2, 'a'};

    Derived d1{};
    Derived d2{1, 2};
    Derived d3{1, 2, 'a'};
}

可以通过以下方式来完成:通过在构造函数和委托程序中显示构造函数和使用声明,前提是编译器支持C++ 2011。否则,您必须自己定义构造函数

#include <iostream>

class Base
{
public:
    Base() : Base( 0, 0.0, '\0' ) {}
    Base(int i, double j) : Base( i, j, '\0' ) {}
    Base(int i, double j, char ch) : m( i ), l( j ), n( ch ) {}
    virtual ~Base() = default;

    virtual void print() const { std::cout << m << ' ' << l << ' ' << n << std::endl; }

private:
    int m;
    double l;
    char n;
};    

class Derived : public Base
{
public:
    using Base::Base;
    void print() const override { Base::print(); } 
};

int main()
{
    Derived( 65, 65.65, 'A' ).print();
}    

问题是,我用几个构造函数派生了一个巨大的类,我觉得有点不知所措,但现在你们提到了它,我应该尝试使用较小的实例。我会尝试一下。不过,这需要一个有能力的C++11编译器。这会命名一个
Base
的构造函数,这是非法的(至少在C++11之前)。@SebastianRedl:我们现在已经过了2015年的一半了。这意味着,尽管有很好的理由不能使用C++11或更高版本,但这些理由必须在问题中明确说明,并且不得假设。@LightnessRacesinOrbit我不是有意批评答案;事实上,我投了更高的票。尽管如此,仍然需要指出,因为微软最新的稳定版本Visual Studio 2013不支持继承的构造函数。(VS 2015确实如此。)@SebastianRedl:我不反对这种观点,好吧,如果我理解正确,我仍然需要知道基类的所有构造函数,如果我想让它们也在派生类中工作。@RDGuida:如果你使用的是一个古老的编译器,是的。如果你能保持最新,那么有一个非常简单的解决方案。我同意@LightnessRacesinOrbit,如果你能使用现代编译器,那么这是最简单和最可维护的解决方案。如果你必须使用它,这个解决方案是有效的,但是要保持它是一件痛苦的事情。@Lightness在轨道上比赛通常是我自己做的。所以我没有迟到。:“巫师从不迟到,也不会早到,他会在他想要的时候准时到达。”
#include <iostream>

class Base
{
public:
    Base() : Base( 0, 0.0, '\0' ) {}
    Base(int i, double j) : Base( i, j, '\0' ) {}
    Base(int i, double j, char ch) : m( i ), l( j ), n( ch ) {}
    virtual ~Base() = default;

    virtual void print() const { std::cout << m << ' ' << l << ' ' << n << std::endl; }

private:
    int m;
    double l;
    char n;
};    

class Derived : public Base
{
public:
    using Base::Base;
    void print() const override { Base::print(); } 
};

int main()
{
    Derived( 65, 65.65, 'A' ).print();
}    
65 65.65 A