Кто -нибудь, пожалуйста, просмотрите ниже процедуру о том, как компилятор работает с полиморфизмом, и дайте мне знать, если есть что -то неправильное? Спасибо! < /P>
Шаг 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 (
Кто -нибудь, пожалуйста, просмотрите ниже процедуру о том, как компилятор работает с полиморфизмом, и дайте мне знать, если есть что -то неправильное? Спасибо! < /P> Шаг 1: Создание и обслуживание VTable из наиболее базового класса до наиболее полученного класса на основе следующих правил: < /p> [list] [*] Если функция объявлена виртуальной в классе (с предками или без), она появится в vtable. < /p> < /li> Если полученный класс определяет функцию с той же именем и подписью [b] и подпись [/b] в качестве виртуальной функции в своем предке, версия полученного класса заменит версию предка в 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 не является потомком [b] [/b] a или if (2) Все предки C не полиморфные, то Dynamic_cast возвращает null.
[*] Если ptr_c не является нулевым, во время выполнения, dynamic_cast предоставляет доступ ко всем публичным/защищенным функциям, объявленным в C , и в тех унаследован от предков C ([code]A[/code] и b ).