对C++类继承有点生疏

A little rusty on C++ class inheritance

本文关键字:继承 C++      更新时间:2023-10-16

子类访问受保护成员对象的规则是什么?我以为我理解它们,但我的代码不同意。

我有一个基类,定义为

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

I将基准分类如下:

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

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

问题是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也存在类似的问题。

Column是另一个Column对象的成员时可以访问right和left,但不是任意Datum对象的成员。