我对类和超类共享字段有点困惑。我原以为这是好的:
class SuperC {
public:
SuperC();
protected:
double value;
};
class C : public SuperC {
public :
C(double value);
};
SuperC::SuperC(){}
C::C(double value):SuperC(),value(value){}
但是编译器告诉我C没有字段“value”。 C不继承SuperC中定义的那个?
很多人答案 0 :(得分:8)
确实如此,但您只能使用构造函数初始化列表语法初始化当前类成员。
您必须在SuperC
中创建一个重载的构造函数,用于初始化value
并调用它。
class SuperC {
public:
SuperC();
SuperC(double v) : value(v) {}
protected:
double value;
};
class C : public SuperC {
public :
C(double value);
};
SuperC::SuperC(){}
C::C(double value):SuperC(value){}
答案 1 :(得分:1)
您无法在派生类的构造函数初始化列表中初始化基类成员。
fix1: 最大可以通过将参数传递给BC来初始化派生类中的基类(BC)构造函数。
fix2:在派生类构造函数的主体中分配基类成员,而不是构造函数初始化列表
C::C(double value1):SuperC()
{
value = value1;
}