Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的继承和构造函数定义+;_C++_Inheritance_Default Constructor - Fatal编程技术网

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

C++ C+中的继承和构造函数定义+;,c++,inheritance,default-constructor,C++,Inheritance,Default Constructor,我有一个基类和一个派生类: class Neuron { protected: double input; double output; }; class InputNeuron : public Neuron { public: InputNeuron(); }; 派生类的默认构造函数定义如下 InputNeuron::InputNeuron() : input(0.0), output(0.0) {} 问题是: 输入和输

我有一个基类和一个派生类:

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

class InputNeuron : public Neuron
{
    public:
        InputNeuron();
};
派生类的默认构造函数定义如下

InputNeuron::InputNeuron() : input(0.0), output(0.0) {}
问题是: 输入和输出的初始化错误


我的目标是从继承中获益,避免在派生类中重新定义输入和输出。但是,在当前状态下,使用这些成员会产生一条消息:
输入不是一个非静态数据成员或InputNeuron类的基类,消息我似乎无法从中派生信息。

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

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) {}
        //              ^^^^^^^^^^^^
};

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

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

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) {}
        //              ^^^^^^^^^^^^
};

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

这是否意味着如果我希望派生类的默认构造不同,除了向每个派生类添加公共类成员之外,没有其他解决方案了?没有,请参阅我的答案。给定足够低级别的受保护的基类构造函数,派生类应该能够以它们喜欢的任何方式初始化基类。这并不能解决这个问题,但是一个名为
output
的数据成员的
InputNeuron
似乎很奇怪。不是说这是错的……是的,我承认。选择,选择。我可以在这个对象中添加一些预处理,不管它看起来多么不雅观。正如您所想象的,在效率和设计上都有改进的余地。这是否意味着如果我希望派生类的默认构造不同,除了向每个派生类添加公共类成员之外,没有其他解决方案了?不,请参见我的答案。给定足够低级别的受保护的基类构造函数,派生类应该能够以它们喜欢的任何方式初始化基类。这并不能解决这个问题,但是一个名为
output
的数据成员的
InputNeuron
似乎很奇怪。不是说这是错的……是的,我承认。选择,选择。我可以在这个对象中添加一些预处理,不管它看起来多么不雅观。可以想象,在效率和设计上都有改进的余地。