代码之家  ›  专栏  ›  技术社区  ›  Wyllich

C++中继承与构造函数的定义

  •  1
  • Wyllich  · 技术社区  · 6 年前

    我有一个基类和派生类:

    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 ,我似乎无法从中获得信息。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Kerrek SB    6 年前

    类构造函数只能初始化类的(直接)数据成员;它不初始化基类数据成员。相反,您需要使用一个基类构造函数。首先需要定义一个适当的基本构造函数。如果只希望派生类使用它,请将其设置为 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) {}
            //              ^^^^^^^^^^^^
    };
    

    (你 能够 同时保留受保护的基础数据成员,然后 分配 在派生构造函数的主体中,这是不好的样式,因为最好用预期值立即初始化变量。)