【问题标题】:How can a parent members be called in Private Inheritance?如何在私有继承中调用父成员?
【发布时间】:2012-03-03 10:42:22
【问题描述】:

我正在阅读 GoF 的一本关于设计模式的书 - online link

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

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()) 函数如何尝试访问它?

更新:

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

【问题讨论】:

  • “我的理解是,在私有继承中,所有父类成员都变得不可访问”:如果您无法访问派生类?

标签: c++ design-patterns private-inheritance


【解决方案1】:

在私有继承期间,父类成员变得不可访问对于其他所有人,而不是类本身!父类的受​​保护成员和公共成员仍然可以在派生中访问班级和朋友。

例子:

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
}

【讨论】:

  • 感谢您的澄清。这很有帮助。
【解决方案2】:

继承如何影响访问:

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

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

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

【讨论】:

  • 哦,好像它们在派生类中变成了私有的,但不是不可访问的,这样理解对吗?
  • @linuxeasy:如果您说的是受保护成员和公共成员,那么是的,您的理解是正确的。无论继承类型如何,派生类中都不能访问私有成员(除非派生类被声明为基类的朋友,这种情况很少见)
  • @ArmenTsirunyan:谢谢,我在阅读有关私有继承的内容时出现了错误的概念。我觉得,它甚至会阻止访问任何成员,而实际上它会更改访问说明符而不是可访问性。非常感谢你的澄清:)
  • @KerrekSB:这个答案对于澄清这个概念也很有帮助。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2011-02-10
  • 2020-09-01
  • 2018-05-11
  • 2012-01-04
  • 2011-09-26
  • 2011-02-26
相关资源
最近更新 更多