2012-12-18 38 views
0

我遇到this未解答的问题,这真的令人费解。这种行为应该是有意义的吗?它是否在标准?这是一个问题:派生的基地访问的朋友

class parentFriend; 
class parent 
{ 
    friend class parentFriend; 
    public: void f1(){}; 
    protected: void f2(){}; 
    private: void f3(){}; 
}; 
class childpub: public parent {}; 
class childprot: protected parent {}; 
class childprv: private parent {}; 
class parentFriend 
{ 
    public: 
    void f() 
    { 
    /* which of the following statements will compile? why? why not?*/ 
    parent p; p.f1(); p.f2(); p.f3(); // these will compile 
    childpub cpub; cpub.f1(); cpub.f2(); cpub.f3(); 
    childprot cprot; cprot.f1(); cprot.f2(); 
    cprot.f3(); // does not compile 
    childprv cprv; 
    cprv.f1(); // does not compile 
    cprv.f2(); // does not compile 
    cprv.f3(); // does not compile 
    } 
}; 

回答

1

从我的理解读你发布的链接(也看到了同样的问题here与一些答案),原题的作者是由GCC编译器的行为(线程惊讶从2009年,gcc版本4.0.1中的线程)这是编译没有错误mentionned这条线,而它不应该有:

childprot cprot; cprot.f1(); cprot.f2(); // (2) 

我想你的代码与2010年MSVC和这行不进行编译时,友谊不像标准预期的那样被遗传。

+0

太好了,谢谢你。我的gcc 4.2.4仍然像原文中的那样。请告诉我,除了cpub.f1(),当然还有p.f?()之外,什么都可以编译,因为它们不应该。 –