C ++类继承有点生疏

时间:2011-10-25 21:04:16

标签: c++ inheritance

访问受保护成员对象的子类有哪些规则?我以为我理解他们,但我的代码不同意。

我有一个基类,定义为

class Datum {
public:
   Datum(Datum *r, Datum *l) : right(r), left(l) {}

protected:
   Datum *right, *left;
};

我将Datum子类化如下:

class Column: public Datum
{
public:
   Column(Datum *r, Datum *l, string n, int s): Datum(r,l), name(n), size(s) {}

   void cover() {
      right->left = left;
      left->right = right;
   }

protected:
   string name;
   int size;
};

当我使用G ++ v.4.5.1进行编译时,我收到指向封面中两行的错误消息:

error: Datum* Datum::right is protected
error:  within this context
error: Datum* Datum::left is protected
error:  within this context

显然,将该部分公开会导致错误消失。当该部分受到保护时,他们为什么会在那里?

2 个答案:

答案 0 :(得分:4)

问题是Datum::Datum *right受到保护。指针right是可访问/可分配的,因为基类是公开继承的。但是right指向的对象没有以成员函数Column::cover()尝试的方式访问优先级,因为right指向的对象在派生的当前范围内没有直接关系类。

 void cover() {
      // Not posssible right->left = left;

      // But -
       right = new Datum(); // Assuming the class has default constructor.
 }

类似的问题也是Datum::Datum *left

答案 1 :(得分:3)

当列是另一个Column对象的成员时,列可以左右访问,但当它们是任意Datum对象的成员时,则不能访问。