Шаг 1: Создание и обслуживание VTable из наиболее базового класса до наиболее полученного класса на основе следующих правил: < /p>
- Если функция объявлена виртуальной в классе (с предками или без), она появится в vtable. < /p>
< /li>
Если полученный класс определяет функцию с той же именем и подписью и подпись в качестве виртуальной функции в своем предке, версия полученного класса заменит версию предка в Vtable, независимо от того, полученным классом. использует ключевое слово переопределения . В противном случае получаемая функция не заменяет виртуальную функцию базового класса в VTable. Вместо этого он рассматривается как новая функция. - Если функция в производном классе объявляется как переопределение в полученном Класс, тогда должна быть виртуальная функция с тем же именем и подписью в своем классе предков. vtable и разрешается во время компиляции на основе статического типа. < /p>
< /li>
< /ul>
Шаг 2: Если мы попытаемся вызвать Функция (скажем, func () ), используя указатель, созданный* ptr_a = new c ()
Если функция не является виртуальной в иерархии наследования между и c, ptr_a-> func () вызовы, которые объявляются в на основе статического типа.
Если функция является виртуальной: во время компиляции, компилятор определяет, какие функции доступны через статический тип ptr_a < /code> (т.е. , Все общедоступные/защищенные виртуальные функции, объявленные в , доступны). - Если функция доступна во время компиляции, мы Поиск имени функции в VTable и определите, какую конкретную реализацию виртуальной функции выполняется. < /p>
< /li>
< /ul>
Шаг 3: Если мы Динамический отлив указатель, как это: c* ptr_c = dynamic_cast (ptr_a); < /code> < /p>
Сначала проверьте, если Ptr_cc null. Если (1) C не является потомком a или if (2) Все предки C не полиморфные, то Dynamic_cast возвращает null. - Если ptr_c не является нулевым, во время выполнения, dynamic_cast предоставляет доступ ко всем публичным/защищенным функциям, объявленным в C , и в тех унаследован от предков C (A и b ).
C::bar
B::foo
Подробнее здесь: https://stackoverflow.com/questions/794 ... lymorphism