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

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

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

这是一个例子。编译时,我在“return new 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 的友元,这是我想避免的事情。

任何想法 ?

有帮助吗?

解决方案

看: C++ 中的友元范围
投票完全重复。

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

正确的

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

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

其他提示

友谊是不会继承的,你必须明确地声明每个朋友关系。 (请参见“友谊是不会继承的,传递的,或相互“)

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

朋友指令最初旨在作为一些 “漏洞” 绕过封装机制。

使用的朋友的,你必须精确地指定(!),哪些类是你的朋友。友谊是不能继承等的 FooOriginator 在您的例子中,没有获得的备忘录

不过,理想情况下,你想如何使用的朋友解决你的问题之前的指示,我建议你去看看在一般的设计,并试图摆脱的需要使用的朋友的,因为它可以看到生活在同一类别作为我们爱的转到的:)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top