关于继承中受保护成员的问题

时间:2011-03-10 04:11:14

标签: c++ inheritance

我认为通过继承类可以访问受保护的成员。那么,相信这是好的,我在思考过程中的错误是什么?

我有一些课程,食物和蔬菜,Veg继承自食物。食物有受保护的成员年龄;在Veg的构造函数中,我尝试将age初始化为0.为什么这不起作用?

一些代码......

Veg::Veg():age(0)
{
    cout << "Veg constructor." << endl;
}

class Veg : public Food
{
//snip
};

class Food
{
//snip
protected:
    int age;
};

2 个答案:

答案 0 :(得分:7)

在类C的构造函数的初始化列表中,您只能初始化

  1. C的直接基类,
  2. 班级C的虚拟基类,以及
  3. 班级C的非静态数据成员。
  4. 如果要初始化基类的数据成员,则需要在基类的构造函数的初始化列表中或派生类的构造函数的主体中执行此操作。您不能在派生类的构造函数的初始化列表中执行此操作。

答案 1 :(得分:2)

这是如何设计初始化列表的;在这种情况下,声明成员的类负责初始化。

通常,食物暴露年龄作为构造函数中的参数:

Food::Food(const int& inAge) : age(inAge) {}
Veg::Veg() : Food(-1) {}

但是,如果受到保护,您仍然可以访问ctor的身体年龄:

Veg::Veg() : Food() {this->age = -1;}

如果不是这样,那么你将构建两次年龄,这通常在年龄类型比int更复杂的时候很重要。