У меня есть два класса иерархий:Избегайте значение понижающего отливка вдоль параллельных иерархий
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)
, который прекрасно работает, но этот вид опущенных конструктора копий как-то не очень приятно. Все ответы, которые я проверил, показывают примеры с помощью указателей.
Что было бы лучшим решением? Любые альтернативы?
'BaseUnit <- S1Unit, BaseUnit <- S2Unit, ..S3Unit, S4Unit' - Я не могу разобрать этот синтаксис. –
Элемент 'Base :: unit' - это не что иное, как' BaseUnit'. Вы не можете бросить это ни на что, потому что это не что-то еще. Если вам нужен полиморфизм, вам нужно использовать указатели или ссылки. –
Средство S1Unit происходит от BaseUnit. –