C ++ вызывает дочерний метод из родительской ссылки - PullRequest
0 голосов
/ 29 марта 2012

У меня есть

    std::list<TYPE> 

, который может содержать дочерние классы TYPE.Мне нужно перебрать список и вызвать переопределенную версию дочерней функции, определенной в TYPE, но я не буду знать, какой у меня подкласс TYPE, а ссылка имеет тип TYPE.

Если я вызываю с использованиемСсылка на TYPE будет вызывать виртуальный метод TYPE, а не метод моего подкласса.Есть ли способ сказать "вызвать переопределенную версию этого метода самого дальнего подкласса"?

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Вы не можете хранить ссылки в std::list, и ваш список не содержит экземпляров подкласса TYPE.

Если вы присваиваете экземпляр подкласса TYPE для TYPE, он «разрезается», что означает, что вся информация о подклассе теряется.Вот почему вызывается метод TYPE - объект имеет значение a TYPE, а не подкласс TYPE.

Если вам нужен полиморфизм, вы должны хранить указатели - TYPE* или умный указатель - в списке.

0 голосов
/ 29 марта 2012

Нет, так как могут быть различные дочерние классы, унаследованные от вашего базового класса, и вы не будете уверены, какой метод вызывать. Однако вы можете использовать static_cast для преобразования ссылки на базовый класс в ссылку на дочерний класс.

...