0

RoomとEventRoomの2つのクラスがあるプロジェクトに取り組んでいます。EventRoomはRoomを継承し、さらに数人のメンバーがいます。

私のコードではこれを行います(tmpPtrはルームポインターです):

if(eventRoom)
     tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);

後でこれを試してみると:

if(line == "false;")
     tmpPtr->setComplete(false);

コンパイルエラーが発生します。setCompleteはEventRoomのメンバーです

短いバージョン: Roomタイプのオブジェクトを作成したいのですが、場合によってはEventRoomを作成します。現在、コードはRoomでのみ機能しますが、コードの90%はEventRoomでも同じです。同じコードを使用する方法はありますか?(dynamic_castまたは類似のものを使用)

4

2 に答える 2

3

あなたはポインタtmpPtrである必要があります。EventRoot

EventRoom* tmpPtr;

if(eventRoom)
     tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);

ポインタでのみRoomパブリックメソッドを呼び出すことができます。のみのメソッドRoomを呼び出すことはできません。EventRoom

于 2012-11-28T22:43:32.147 に答える
1

と の両方Roomで動作する必要があるコードEventRoom(つまり、Roomインターフェイスでのみ動作する) は、静的に型指定された ポインターを介して動作する必要がありますRoom*

の詳細を使用するコードはEventRoom、静的に型指定されたポインターを介して動作する必要がありますEventRoom*。したがって、コード例は次のようになります。

void someFunction(Room *myRoom) {
  // doRoomStuff must be a function declared in Room.
  myRoom->doRoomStuff();

  // Try to determin if the room is an event room or not. This will
  // occur at runtime.
  EventRoom *myEventRoom = dynamic_cast<EventRoom*>(myRoom);

  if (myEventRoom) {
    // doEventRoomStuff is a function declared in EventRoom. You cannot call
    // myRoom->doEventRoomStuff even if 'myRoom' points to an object that is
    // actually an EventRoom. You must do that through a pointer of type
    // EventRoom.
    myEventRoom->doEventRoomStuff();

    // doRoomStuff2 is a function that is declared in Room. Since every 
    // EventRoom is also a room, every EventRoom can do everything that
    // rooms can do.
    myEventRoom->doRoomStuff2();
  }

  myRoom->doRoomStuff3();
}

Room変数を介してメンバーにアクセスできますEventRoom*が、その逆はできません。

于 2012-11-28T22:53:34.053 に答える