0

重複の可能性:
C++ でこれが許可されないのはなぜですか?

これが C++ で許可されないのはなぜですか??

class base
{
  private:

  public:
      void func()
         {
              cout<<"base";
         }  


};

class derived : private base
{
  private:


  public:
            void func()
         {
              cout<<"derived";
              }


};

int main()
{
base * ptr;
ptr = new derived;
((derived *)ptr)->func();
return 0;
}

エラーが発生します

**61 C:\Dev-Cpp\My Projects\pointertest.cpp `base' is an inaccessible base of `derived'** 

私の質問は、 func() が派生クラスでパブリックに定義されているため、ステートメント ((派生 *)ptr)->func(); 派生の func() を表示しようとしています..継承のモードが原因でアクセス可能な問題があるのはなぜですか..継承のモード (プライベート) は呼び出しにどのように影響しますか. ?

継承モードがパブリックに変更された場合、望ましい結果が得られます..しかし、 func() がベースでプライベートであり(ベースの func() が継承されないため)、また func() が派生およびモードでパブリックである場合継承は公開されているのに、なぜまだ目的の結果が得られるのですか?.前のケースのようにコンパイル エラーが発生するはずですか??

私は完全に混乱しています..この場合、コンパイラがどのように機能するか教えてください..??

4

1 に答える 1

2

プライベート継承がある場合、ベース ポインターが派生オブジェクトを指すようにすることはできません。

パブリック継承はisa関係を表します。一方、プライベート継承は、関係の観点から実装されたものを表現します

Ther コンパイル エラーは次の行を参照します。 ptr = new derived;

于 2010-09-09T12:31:49.810 に答える