【问题标题】:Inheritance and constructor definition in C++C++中的继承和构造函数定义
【发布时间】:2018-11-06 09:52:07
【问题描述】:

我有一个基类和派生类:

class Neuron 
{
    protected:
        double input;
        double output;
};

class InputNeuron : public Neuron
{
    public:
        InputNeuron();
};

派生类的默认构造函数定义如下

InputNeuron::InputNeuron() : input(0.0), output(0.0) {}

问题是: 输入输出初始化错误。

我的目标是从继承中受益,以避免在派生类中重新声明输入和输出。但是,在当前状态下,使用这些成员会引发一条消息:input is not a nonstatic data member or base class of class InputNeuron,我似乎无法从中获取信息。

【问题讨论】:

  • 这是否意味着如果我希望派生类具有不同的默认构造,除了将公共类成员添加到每个派生类之外没有其他解决方案?
  • 不,看我的回答。给定基础的足够低级别的受保护构造函数,派生类应该能够以他们喜欢的任何方式初始化基础。
  • 这并没有解决问题,但是 InputNeuron 有一个名为 output 的数据成员似乎很奇怪。不是说错了……
  • 是的,我承认。选择,选择。我可以在该对象中添加一些预处理,但它可能看起来不优雅。可以想象,无论是效率还是设计,都有提升的空间。

标签: c++ inheritance default-constructor


【解决方案1】:

类构造函数只能初始化类的(直接)数据成员;它不初始化基类数据成员。相反,您需要为此使用基类构造函数。您将需要首先定义一个适当的基本构造函数。如果您只想派生类使用它,请将其设为protected

class Neuron 
{
    protected:
        Neuron(double i, double o) : input(i), output(o) {}
    private:
        double input;
        double output;
};

class InputNeuron : public Neuron
{
    public:
        InputNeuron() : Neuron(0, 0) {}
        //              ^^^^^^^^^^^^
};

(您也可以保留受保护的基础数据成员,然后在派生构造函数的主体中分配给它们,但这不是好的风格,因为最好立即使用它们的预期值初始化变量。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 2023-03-18
    • 2012-11-14
    • 2017-08-09
    • 1970-01-01
    • 2015-07-09
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多