Метод в B не переопределяет метод в A, поэтому виртуальное объявление не должно (как оно не вызывает) вызывать метод в B.Рассмотрим:
class foo
{
public:
void bar();
void bar() const;
}
Это два разных метода, один из которых вызывается для неконстантного объекта, а другой - для константного объекта.
Чтобы ваш код работал так, как вам нужнометод в A также должен быть объявлен как const.