Разрешение доступа к члену базового класса из определенного производного класса
В проекте у меня есть иерархия классов, реализующая граф с уровнями иерархии (то есть узел графа может быть самим графом - представьте, что это электронная схема, в которой ворота могут быть, например, интегрированным чипом). Таким образом, у меня есть некоторый класс Base
выведено в Group
а также Leaf
и класс Base
имеет атрибут ancestor
, который я хотел бы иметь возможность установить из данного метода Group
(при добавлении ребенка), но не из других мест:
class Group;
class Base {
private: // or protected?
Group* ancestor;
};
class Group : public Base {
private:
void setAncestor(Base* child) {
// Something like
child->ancestor = this;
}
};
class Leaf : public Base {
// ...
};
Каков был бы "правильный" способ добиться этого? Обычно я бы использовал friend
методы, но мне кажется, что это невозможно в этом контексте, так как я должен был бы объявить друга Group::setAncestor
в Base
, который должен быть объявлен ранее. (Также обратите внимание, что эти объявления находятся в разных файлах в реальном коде.)
2 ответа
Вы можете объявить его защищенным в Base
и в Leaf
класс и из любого другого места используют частное наследование, поэтому защищенные члены будут частными.
class Group;
class Base {
protected:
Group* ancestor;
};
class Group : public Base {
private:
void setAncestor(Base* newAncestor) {
// Something like
ancestor = newAncestor->ancestor;
}
};
class Leaf : private Base {
// ...
};
Обратите внимание, что я меняю имя с child
в newAncestor
,
Поэтому, когда вы создаете нового ребенка, вы можете сделать что-то вроде этого:
Base ancestor;
Group child;
child->setAncestor(&ancestor)
Элемент данных Base::ancestor должен иметь защищенный доступ. Таким образом, он будет доступен для производных классов.