Я правильно понимаю, как C ++ реализует полиморфизм? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Я правильно понимаю, как C ++ реализует полиморфизм? [закрыто]

Сообщение Anonymous »

Кто -нибудь, пожалуйста, просмотрите ниже процедуру о том, как компилятор работает с полиморфизмом, и дайте мне знать, если есть что -то неправильное? Спасибо! < /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 ( и b ).


Подробнее здесь: https://stackoverflow.com/questions/794 ... lymorphism
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»