0

この未回答の質問に出くわしましたが、本当に不可解です。この振る舞いは意味があるはずですか?規格内ですか?これは質問です:

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 
  }
};
4

1 に答える 1

1

あなたが投稿したリンクを読んで理解したところから(いくつかの回答とともに同じ質問を参照してください)、元の質問の作成者は gcc コンパイラの動作に驚いていました(2009 年のスレッド、スレッドで言及されている gcc バージョン 4.0.1) ) この行はエラーなしでコンパイルされていましたが、次のようにすべきではありません:

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

MSVC 2010 でコードを試してみましたが、この行はコンパイルされません。友情は標準で期待どおりに継承されません。

于 2012-12-18T12:51:17.453 に答える