1

私は非常に単純な基本クラス/派生クラスのシナリオを持っています:

#include <tchar.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>

       class BaseChannel{
          private:
          public:
           virtual ~BaseChannel(){};
           virtual void SayBoo( bool SelectAll)=0;
       };

       class gdbChannel: BaseChannel{
       public:
         void SayBoo(bool SelectAll) {if (SelectAll) cout<<"boo";}
       };

       class UsesChannel{
       public:
          BaseChannel * c;
       };


int _tmain(int argc, _TCHAR* argv[])
{
   gdbChannel gc;
   UsesChannel uc;
   // uc.c = &gc; //cannot convert gdbChannel* to BaseChannel*
   uc.c = (BaseChannel*)&gc; // works
   uc.c->SayBoo(true);
   getch();
    return 0;
}

上記でコメントアウトした私の最初の実装はコンパイルされません。誰でも理由を説明できますか?gdbChannel は明示的に BaseChannel のインスタンスであるため、キャストは必要ないと思います。

4

1 に答える 1

10

これは、派生に継承をgdbChannel使用しないためです (型のデフォルトは です)。publicBaseChannelclassprivate

公開継承を表現したい場合は、次のように記述します。

class gdbChannel : public BaseChannel{
//                 ^^^^^^
public:
    void SayBoo(bool SelectAll) {if (SelectAll) cout<<"boo";}
};
于 2013-04-30T18:10:19.320 に答える