我需要重写基类的构造函数吗?

问题描述 投票:0回答:2

我有一个基类

B
,我将从它派生类
D
D
中唯一不同的是我重写了一个方法。

我是否必须在

B
中重写
D
的构造函数,因为它所做的只是使用完全相同的参数调用
B
的构造函数? 如果我不在
D
中声明构造函数(或析构函数),它会只使用
B
的吗?如果是这样,从哪个版本的 C++ 开始它会这样做?

c++ constructor overriding descendant
2个回答
0
投票

构造函数不能被重写。 他们的作用是正确初始化每个类。

派生类初始化它的变量。 基类初始化它的变量。

您知道您正在构造哪个类,因此不需要虚拟构造函数。 (但是如果你需要创建一个在运行时做出决定的类,你需要知道什么是工厂方法)

但是删除更加棘手(因为您可能持有一个指向基类的指针,该基类被实例化为派生类)

这就是为什么具有虚拟方法的类中的析构函数默认应该是虚拟的(此规则有例外 - 高级主题)。

class Base
{
private:
    int m_secret;

public:
    Base(int magic_number)
        : m_secret(magic_number)
    {}

    virtual int get_secret()
    {
        return m_secret;
    }

    virtual ~Base() = default;
};

class Derived : public Base
{
private:
    int m_multiplier;

public:
    Derived(int magic_number, int multiplier)
        : Base(magic_number),
          m_multiplier(multiplier)
    {}

    int get_secret() override
    {
        return Base::get_secret() * m_multiplier;
    }

    ~Derived() override = default;

0
投票

如评论中所述,将

using B::B
添加到您的
D
类定义中。这将生成
D
的构造函数,其功能与
B
的相应构造函数完全相同。

构造函数不是继承的(与普通方法不同)。要继承构造函数,您需要这个特殊的

using
声明(技术上它不称为继承,但效果是相同的)。

© www.soinside.com 2019 - 2024. All rights reserved.