Мы используем файлы cookie
Мы используем файлы cookie для улучшения работы сайта и предоставления вам персонализированного опыта. Правила использования файлов cookie можно найти в нашей политике конфиденциальности
Механизм виртуальности в C++ реализуется с помощью указателей на функции (таблица виртуальных функций, или VMT - Virtual Method Table) и указателя на эту таблицу (vptr - virtual pointer), который добавляется в каждый объект класса с виртуальными функциями или унаследованный от такого класса.
При объявлении функции как virtual
компилятор создает VMT для данного класса. Эта таблица содержит указатели на фактические реализации виртуальных функций для этого класса.
В каждом объекте класса (или производного от него) добавляется скрытый указатель vptr
, который ссылается на VMT соответствующего типа объекта.
Когда виртуальная функция вызывается через указатель или ссылку на базовый класс, компилятор генерирует код, который использует vptr
объекта для поиска адреса нужной функции в VMT и ее вызова. Это называется динамической диспетчеризацией (или поздним связыванием), так как решение о том, какая именно функция будет вызвана, принимается во время выполнения программы, а не во время компиляции.
Пример:
cpp
В этом примере, несмотря на то что ptr
имеет тип Base*
, при выз
Механизм виртуальности в C++ реализуется с помощью указателей на функции (таблица виртуальных функций, или VMT - Virtual Method Table) и указателя на эту таблицу (vptr - virtual pointer), который добавляется в каждый объект класса с виртуальными функциями или унаследованный от такого класса.
При объявлении функции как virtual
компилятор создает VMT для данного класса. Эта таблица содержит указатели на фактические реализации виртуальных функций для этого класса.
В каждом объекте класса (или производного от него) добавляется скрытый указатель vptr
, который ссылается на VMT соответствующего типа объекта.
Когда виртуальная функция вызывается через указатель или ссылку на базовый класс, компилятор генерирует код, который использует vptr
объекта для поиска адреса нужной функции в VMT и ее вызова. Это называется динамической диспетчеризацией (или поздним связыванием), так как решение о том, какая именно функция будет вызвана, принимается во время выполнения программы, а не во время компиляции.
Пример:
cpp
В этом примере, несмотря на то что ptr
имеет тип Base*
, при выз
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.