如何在私有继承中调用父成员

How can a parent members be called in Private Inheritance?

本文关键字:调用 父成员 继承      更新时间:2023-10-16

我正在阅读GoF的一本关于设计模式的书-在线链接。

在这本书中,在适配器模式的示例代码部分,我遇到了这个特殊的代码:

class TextView {
     public:
         TextView();
         void GetOrigin(Coord& x, Coord& y) const;
         void GetExtent(Coord& width, Coord& height) const;
         virtual bool IsEmpty() const;
}; 

该类TextViewTextShape私有继承,如下所示:

  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())函数是如何试图访问它的呢?

更新:

感谢大家的回答,我在阅读关于私人继承的文章时,有一个错误的想法。我觉得,它甚至会阻止对任何成员的访问,而实际上它会更改访问说明符,而不是可访问性。非常感谢您澄清:)

在私有继承过程中,父成员对其他所有人都是不可访问的,而不是类本身父类的受保护成员和公共成员在派生类及其友元中仍然可以访问。

示例:

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
}

以下是继承如何影响访问:

  • 公共继承使公共基础成员成为公共成员,受保护的成员受到保护,私有基础成员不可访问。

  • 受保护的继承使公共和受保护的基成员在派生类中受到保护,并且私有基成员不可访问。

  • 私有继承使公共和受保护的基成员在派生类中是私有的,并且私有基成员是不可访问的。