2013-03-25 3 views
0

У меня есть два класса иерархий:Избегайте значение понижающего отливка вдоль параллельных иерархий

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

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

+1

'BaseUnit <- S1Unit, BaseUnit <- S2Unit, ..S3Unit, S4Unit' - Я не могу разобрать этот синтаксис. –

+1

Элемент 'Base :: unit' - это не что иное, как' BaseUnit'. Вы не можете бросить это ни на что, потому что это не что-то еще. Если вам нужен полиморфизм, вам нужно использовать указатели или ссылки. –

+0

Средство S1Unit происходит от BaseUnit. –

ответ

1

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

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