繁体   English   中英

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

[英]Do I need to reimplement all the constructor of a base class even if a derived class has no member variables?

我们假设我有一个基类

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();
};

有没有一种方法可以在派生类上使用基类的所有构造函数,而无需为Derived类重写所有这些构造函数?

由于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;
};

然后,您可以让Derived具有类似的构造函数,这些构造函数使用Base构造函数来初始化继承的成员变量。

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

    void print() override { std::cout << "Derived" << std::endl; };
};

举个例子

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

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

您可以通过委派构造函数和using声明来执行此操作,因为它在演示程序中显示,前提是您的编译器支持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();
}    

程序输出是

65 65.65 A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM