0

我正在做一个项目,其中有 2 个类:Room 和 EventRoom 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-only 方法。

于 2012-11-28T22:43:32.147 回答
1

必须与两者一起使用的代码RoomEventRoom也就是说,它只与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 回答