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
似乎很奇怪。不是说这是错的……是的,我承认。选择,选择。我可以在这个对象中添加一些预处理,不管它看起来多么不雅观。可以想象,在效率和设计上都有改进的余地。