2009-01-29 90 views
4

在C++中,我有一个A级是朋友与B类朋友类:继承类不是朋友吗?

我看起来像B的继承类不是A级

的朋友,我这个C++或我的错误的限制?

这里是一个例子。编译时,出现“返回新纪念品”错误:

纪念品::纪念品:不可能访问在纪念品中声明的私人成员。

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作为纪念品的朋友,但后来,这意味着我将不得不添加的所有始发继承类作为纪念品,这是我想避免的朋友。

有什么想法?

+0

http://stackoverflow.com/questions/437250/friend-scope-in​​-c/437507 – 2009-01-29 12:59:21

回答

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的方式++工作。我不认为这是一个限制。

0

朋友指令原本是作为一些“漏洞”来绕过封装机制。

朋友你必须指定(!),你的朋友是哪些类。友谊不是继承,所以FooOriginator无权访问纪念品在你的例子。

但理想情况下,你想如何与朋友指令解决你的问题之前,我建议你去看看在一般的设计,并尝试摆脱需要使用朋友因为它可以被看作与我们所爱的goto :)

+0

我不会说那个朋友跟goto一样糟糕。当你可以使用它来缩小公共接口时,甚至可以改进封装。但是,这种情况很少,太多的朋友会破坏你的私人生活。 – gimpf 2009-01-29 10:00:59

+0

朋友不错。它可以在两个或更多属于一个类的逻辑组中进行封装,但由于没有(并且没有模块级保护),因此无法制作模块:相反,您使用C++中的朋友而不是内部或封装级保护在Java中。 – 2009-01-29 12:53:50

3

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