У меня есть две иерархии классов:
BaseUnit <- S1Unit , BaseUnit <- S2Unit, ..S3Unit, S4Unit
а также
Base <- S1 , Base <- S2
В Base
Я сохранил стоимость единицы.
class Base {
protected: BaseUnit unit; // actually this is an upcast of S1Unit, S2Unit
// of course I do several things with unit on methods of Base
}
который основан на S1Unit, S2Unit ..
S1::S1(S1Unit s1unit) : unit(s1unit) { .. }
Однако, если бы я сейчас хотел вернуть специализированный модуль в S1, как мне лучше всего это сделать?
S1Unit S1::getUnit() const { return this->unit; /* how to cast down? */ }
Я мог бы реализовать S1Unit
конструктор BaseUnit
S1Unit::S1Unit(BaseUnit)
который работает нормально, но этот вид конструктора с пониженной копией как-то не очень хорош. Все проверенные мной ответы показывают примеры с использованием указателей.
Что было бы лучшим решением? Есть альтернативы?
Функциональность, которая отличается между вашими классами, должна быть раскрыта через виртуальные функции.
Тогда вам не нужно бросать объект, и вы можете просто вернуться unit
, Вызванные функции-члены будут правильными для созданных вами объектов.
Других решений пока нет …