代码之家  ›  专栏  ›  技术社区  ›  Jérôme

朋友类:继承的类也不是朋友吗?

  •  4
  • Jérôme  · 技术社区  · 15 年前

    在C++中,我有一个A类,它是B类的朋友。

    我觉得B的继承阶级不是A阶级的朋友。

    我这是C++的限制还是我的错误?

    下面是一个例子。编译时,我在“返回新的备忘录”行上得到一个错误:

    memento::memento:无法访问memento中声明的私有成员。

    class Originator;
    
    class Memento
    {
      friend class Originator;
    
      Memento() {};
    
      int m_Data;
    
    public:
      ~Memento() {};
    };
    
    class Originator
    {
    public:
      virtual Memento* createMemento() = 0;
    };
    
    class FooOriginator : public Originator
    {
    public:
      Memento* createMemento()
      {
        return new Memento; // Impossible to access private member of Memento
      }
    };
    
    void main()
    {
      FooOriginator MyOriginator;
      MyOriginator.createMemento();
    
    }
    

    当然,我可以将fooriginator添加为memento的朋友,但这意味着我必须将继承的所有创建者类添加为memento的朋友,这是我想要避免的。

    有什么想法吗?

    5 回复  |  直到 15 年前
        1
  •  7
  •   Community omersem    7 年前

    见: Friend scope in C++
    投票结果完全相同。

    I looks like inherited classes of B are not friend of class A.
    

    对的

    I this a limitation of C++ or my mistake ?
    

    这是C++的工作方式。我不认为这是一种限制。

        2
  •  6
  •   sth Wojciech Parzych    15 年前

    友谊不是继承的,你必须明确地宣布每一个朋友的关系。(也见) friendship isn't inherited, transitive, or reciprocal “”

        3
  •  3
  •   Tanveer Badar    15 年前

    友谊不能传递或继承。毕竟,你朋友的朋友可能不是你的朋友,或者你父亲的朋友一般不是你的朋友。

        4
  •  0
  •   Kosi2801    15 年前

    这个 朋友 指令最初是作为绕过封装机制的“漏洞”而设计的。

    朋友 您必须准确地指定!!)哪门课是你的朋友。友谊不是继承的,所以 发源者 无法访问 纪念品 在你的例子中。

    但理想情况下,在你考虑如何解决你的问题之前, 朋友 指导,我建议你看看你的设计,试着摆脱使用的需要 朋友 就像我们所爱的人一样 古托 :)

        5
  •  0
  •   Patrick    15 年前

    友谊不是遗传的,看 http://www.cplusplus.com/doc/tutorial/inheritance.html ,什么是从基类继承的?