Как можно назвать членов-родителей в частном наследовании?
Я прохожу книгу по шаблонам дизайна от GoF - онлайн-ссылка.
В этой книге в разделе "Шаблон адаптера" в разделе "Образец кода" я встретил этот конкретный код:
class TextView {
public:
TextView();
void GetOrigin(Coord& x, Coord& y) const;
void GetExtent(Coord& width, Coord& height) const;
virtual bool IsEmpty() const;
};
Этот класс TextView
в частном порядке наследуется TextShape
как показано ниже:
class TextShape : public Shape, private TextView {
public:
TextShape();
virtual void BoundingBox(
Point& bottomLeft, Point& topRight
) const;
virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
};
Тогда в этом void TextShape::BoundingBox
функция как ниже:
void TextShape::BoundingBox (
Point& bottomLeft, Point& topRight
) const {
Coord bottom, left, width, height;
GetOrigin(bottom, left); //How is this possible? these are privately inherited??
GetExtent(width, height); // from textView class??
bottomLeft = Point(bottom, left);
topRight = Point(bottom + height, left + width);
}
Как видно, функции GetExtent
& GetOrigin
называется TextShape, тогда как класс TextView
содержащие их были унаследованы в частном порядке.
Насколько я понимаю, в частном наследовании все parent class
участники становятся недоступными, так как это (void TextShape::BoundingBox()
) функция пытается получить к нему доступ?
ОБНОВИТЬ:
Спасибо всем, что ответили, я вошел в заблуждение, читая о частном наследовании. Я чувствовал, что это даже предотвратило бы доступ к любому из участников, тогда как фактически это изменяет спецификаторы доступа, а не доступность. Спасибо большое за разъяснения:)
2 ответа
Во время частного наследования родительские члены становятся недоступными для всех остальных, а не для самого класса! Защищенные и общедоступные члены родительского класса по-прежнему доступны в производном классе и его друзьях.
Пример:
class Base
{
public: int publ;
protected: int prot;
private: int priv;
};
class Derived: private Base
{
friend void g();
void f()
{
priv = 42; //error, priv is private
prot = 42; //OK
publ = 42; //OK
}
};
int main()
{
Derived d;
d.priv = 42; //error
d.prot = 42; //error
d.publ = 42; //error
}
void g()
{
Derived d;
d.priv = 42; //error
d.prot = 42; //OK
d.publ = 42; //OK
}
Вот как наследование влияет на доступ:
Публичное наследие делает членов публичной базы общедоступными, защищенных членов защищенными, а члены частной базы недоступными.
Защищенное наследование делает общедоступные и защищенные базовые члены защищенными в производном классе, а закрытые базовые члены недоступны.
Частное наследование делает публичные и защищенные базовые члены частными в производном классе, а частные члены базы недоступны.