Пример, который вы опубликовали, очень прост и не показывает ничего, что требует вызова виртуального метода.Используя те же классы, изучите эту функцию;
void bar(A* a) {
a->foo();
}
Компилятор не сможет определить во время компиляции, является ли a
экземпляром B
, или C
, или простымA
.Это может быть решено только во время выполнения в общем случае.
Компилятор даже не может знать, будут ли новые классы, производные от A
, в какой-то момент в будущем, которые будут связаны с этим кодом.*