Все правы, конечно, в том, что вам нужно пометить функцию как виртуальную.Но почему это так?
В C ++ вызовы не виртуальных функций разрешаются во время компиляции с использованием типа ссылки , а не фактического типа объекта.Вот почему в вашем случае вызывается функция Foo :: getLength () - ваша функция объявляется для использования Foo.
Однако, если вы объявляете функцию виртуальной, фактический типobject определяет, какая функция вызывается.
Прочитайте раздел виртуальных функций в C ++ FAQ для всех подробностей.
(Сравните этот сценарий с языком, подобным Java, гдеМетоды экземпляра по умолчанию являются виртуальными.)