5

我对类和超类共享字段有点困惑。我期待这没问题:

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 没有字段“值”。C 不继承自 SuperC 中定义的那个?

很多谢谢

4

2 回答 2

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){}
于 2013-04-12T10:02:27.593 回答
1

您不能在派生类的构造函数初始化列表中初始化基类成员。

修复1:最多您可以通过将参数传递给BC来初始化派生类中的基类(BC)构造函数。

fix2:在派生类构造函数的主体中分配基类成员而不是构造函数初始化列表

C::C(double value1):SuperC()
 {
      value = value1;
 }
于 2013-04-12T10:09:42.620 回答