题
在 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 时,什么是从基类继承?
不隶属于 StackOverflow