1

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);
     }

ご覧のとおり、関数GetExtentGetOriginは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 に答える