Существует большая разница между функциями ActionOnA
и GetE
; GetE
- это виртуальная функция, поэтому компилятор записывает переход к соответствующей функции в таблице виртуальных функций объекта, которая определяется во время выполнения.
Однако, когда мы смотрим на ActionOnA, компилятору нужно «знать» , какую функцию записывать во время компиляции (она не виртуальная!), поэтому он ставит наиболее подходящую перегрузку функции, которая составляет ActionOnA(A*)
. Та же проблема возникнет с шаблонами, которые определяются во время компиляции, поэтому он не будет выбирать перегрузку в соответствии со своим типом времени выполнения.
Как писал ChrisMM , вы можете попытайтесь сделать dynamic_cast
, который может потерпеть неудачу. Но мне кажется, что проблема немного в другом:
Вы хотите иметь динамическую c функцию в A, которая выполняет допустимую операцию во время выполнения:
virtual void updateE(bool shouldResetE);
В A_A:
void updateE(bool shouldResetE) final
{
this->E = shouldResetE ? 100 : this->E - 100;
}
Кроме того, настоятельно рекомендуется использовать спецификаторы override
и final
, поскольку это помогает отлавливать ошибки во время компиляции (override
будет предупреждать о неправильном переопределении функции , final
будет предупреждать при попытке переопределить эту функцию при наследовании классов). Если A_ * не предназначен для наследования, укажите его с помощью final
.