Ваше утверждение о ветвлении при вызове виртуальной функции неверно. В сгенерированном коде такого нет. Посмотрите на ассемблерный код, который даст вам лучшее представление.
В ореховой оболочке одна общая упрощенная реализация виртуальной функции C ++: каждый класс будет иметь виртуальную таблицу (vbtl), а каждый экземпляр класса будет иметь указатель виртуальной таблицы (vptr). Виртуальная таблица - это в основном список указателей функций.
Когда вы вызываете виртуальную функцию, говорите, что это похоже на:
class Base {};
class Derived {};
Base* pB = new Derived();
pB->someVirtualFunction();
Функция someVirtualFunction () будет иметь соответствующий индекс в vtbl. И звонок
pB->someVirtualFunction();
будет преобразован во что-то вроде:
pB->vptr[k](); //k is the index of the 'someVirtualFunction'.
Таким образом, функция фактически вызывается косвенно и имеет полиморфизм.
Предлагаю вам прочитать 'Объектная модель C ++' Стенли Липпмана.
Кроме того, утверждение о том, что вызов виртуальной функции медленнее, чем регистр коммутации, не накапливается. Это зависит. Как вы можете видеть выше, вызов виртуальной функции - это всего лишь 1 дополнительное время разыменования по сравнению с обычным вызовом функции. А с разветвлением корпуса коммутатора у вас будет дополнительная логика сравнения (которая дает шанс пропустить кэш для процессора), которая также потребляет циклы процессора. Я бы сказал, что в большинстве случаев, если не во всех, вызов виртуальной функции должен выполняться быстрее, чем в switch-case.