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

时间:2009-01-29 09:27:52

标签: c++ class friend

在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();

}

我当然可以将FooOriginator添加为Memento的朋友,但是,这意味着我必须将所有Originator继承的类添加为Memento的朋友,这是我想要避免的。

有什么想法吗?

5 个答案:

答案 0 :(得分: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 ++的工作方式。我不认为这是一种限制。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

friend 指令最初是作为绕过封装机制的“漏洞”。

使用朋友,你必须准确指定(!),哪些类是你的朋友。友谊不是继承的,因此 FooOriginator 无法访问您示例中的 Memento

但理想情况下,在您考虑如何使用 friend 指令解决问题之前,我建议您一般来看看您的设计,并尝试摆脱对使用朋友,因为它可以看作与我们喜爱的 goto 生活在同一类别中:)

答案 4 :(得分:0)

友谊未被继承,请参阅http://www.cplusplus.com/doc/tutorial/inheritance.html,什么是从基类继承的?