1

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

更新:

感谢大家的回答,我在阅读私有继承时陷入了错误的观念。我觉得,它甚至会阻止访问任何成员,而实际上它会更改访问说明符而不是可访问性。非常感谢你澄清:)

4

2 回答 2

3

在私有继承期间,其他所有人都无法访问父成员,而不是类本身!父类的受保护和公共成员仍然可以在派生类及其朋友中访问。

例子:

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
}
于 2012-03-03T10:44:17.313 回答
3

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

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

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

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

于 2012-03-03T10:45:20.033 回答