Как можно назвать членов-родителей в частном наследовании?

Я прохожу книгу по шаблонам дизайна от 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
}

Вот как наследование влияет на доступ:

  • Публичное наследие делает членов публичной базы общедоступными, защищенных членов защищенными, а члены частной базы недоступными.

  • Защищенное наследование делает общедоступные и защищенные базовые члены защищенными в производном классе, а закрытые базовые члены недоступны.

  • Частное наследование делает публичные и защищенные базовые члены частными в производном классе, а частные члены базы недоступны.

Другие вопросы по тегам