访问受保护成员对象的子类有哪些规则?我以为我理解他们,但我的代码不同意。
我有一个基类,定义为
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
显然,将该部分公开会导致错误消失。当该部分受到保护时,他们为什么会在那里?
答案 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对象的成员时,则不能访问。