Избегайте понижения значения в параллельных иерархиях

У меня есть две иерархии классов:

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) который работает нормально, но этот вид конструктора с пониженной копией как-то не очень хорош. Все проверенные мной ответы показывают примеры с использованием указателей.

Что было бы лучшим решением? Есть альтернативы?

0

Решение

Функциональность, которая отличается между вашими классами, должна быть раскрыта через виртуальные функции.

Тогда вам не нужно бросать объект, и вы можете просто вернуться unit, Вызванные функции-члены будут правильными для созданных вами объектов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]