Как можно назвать членов-родителей в частном наследовании? - PullRequest
1 голос
/ 03 марта 2012

Я изучаю книгу «Шаблоны проектирования» от 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()) пытается получить к ней доступ?

UPDATE:

Спасибо всем, что ответили, я ошибся, читая о частном наследовании. Я чувствовал, что это даже предотвратило бы доступ к любому из участников, тогда как фактически это изменяет спецификаторы доступа, а не доступность. Спасибо большое за разъяснения:)

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

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

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

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

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

3 голосов
/ 03 марта 2012

Во время частного наследования родительские члены становятся недоступными для всех остальных, а не для самого класса! Защищенные и открытые члены родительского класса по-прежнему доступны в производном классе иего друзья.

Пример:

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
}
...