Я работаю над проектом, где у меня есть 2 класса: Room и EventRoom
EventRoom наследуется от Room и имеет еще несколько членов.
В моем коде я делаю это (tmpPtr является Room-указатель):
if(eventRoom)
tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);
и позже, когда я попробую это:
if(line == "false;")
tmpPtr->setComplete(false);
Я получаю ошибки компиляции. SetComplete является участником EventRoom
Укороченная версия: Я хочу создать объекты типа Room, а в некоторых случаях EventRoom. Код в настоящее время работает только для Room, но 90% кода будет идентичным для EventRoom. Любой способ использовать тот же код? (с dynamic_cast или чем-то похожим)
Тебе нужно tmpPtr
быть EventRoot
указатель.
EventRoom* tmpPtr;
if(eventRoom)
tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);
Вы можете только позвонить Room
публичные методы на Room
указатель. Вы не можете позвонить EventRoom
Только методы.
Код, который должен работать с обоими 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*
переменная, но не наоборот.