4

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

我看起来 B 的继承类不是 A 类的朋友。

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

这是一个例子。编译时,“return new Memento”行出现错误:

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 的朋友,这是我想避免的。

任何的想法 ?

4

5 回答 5

7

请参阅:C++ 中的朋友范围
投票完全相同。

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

正确的

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

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

于 2009-01-29T13:00:23.877 回答
6

友谊不是继承的,您必须明确声明每个朋友关系。(另见“友谊不是继承的、传递的或互惠的”)

于 2009-01-29T09:40:29.600 回答
3

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

于 2009-01-29T17:13:28.000 回答
0

朋友指令最初是为了绕过封装机制的一些“漏洞” 。

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

但理想情况下,在您考虑如何使用friend指令解决问题之前,我建议您总体上看一下您的设计并尝试摆脱使用friend的需要,因为它可以被视为居住在与我们喜爱的goto相同的类别:)

于 2009-01-29T09:40:51.377 回答
0

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

于 2009-01-29T09:43:40.047 回答