при чтении Essential c++ главы 5.10 Идентификация типа во время выполнения я столкнулся с проблемой. Позвольте мне сначала представить небольшую предысторию. Есть базовый класс с именем num_sequence
и класс Fibonacci
, производный от num_sequence
. В базовом классе есть виртуальная функция с именем gen_elems
, а производный класс имеет собственное определение.
Следующее взято из книги.
Fibonacci fib;
num_sequence *ps = &fib;
ps->gen_elems(64);
Мы знаем, что будет вызван экземпляр Фибоначчи gen_elems(). Однако, хотя из этого теста мы знаем, что ps обращается к объекту класса Fibonacci, попытка вызвать экземпляр gen_elems() Fibonacci непосредственно через ps приводит к ошибке времени компиляции:
ps->Fibonacci::gen_elems(64); //выдает ошибку времени компиляции
ps не знает тип объекта, к которому он обращается, даже если мы и механизмы typeid и виртуальных функций знают.
Чтобы вызвать экземпляр Фибоначчи для gen_elems(), мы должны указать компилятору преобразовать
ps
в указатель типа Фибоначчи. Эту работу могут выполнять как static_cast, так и dynamic_cast.
Меня смущает жирная фраза. ps->gen_elems(64)
фактически вызывает экземпляр Фибоначчи gen_elems()
. Зачем нам использовать static_cast и dynamic_cast, чтобы преобразовать его в указатель типа Фибоначчи?