Приведение
Если класс является производным от базового класса, содержащего виртуальные функции, то в языке C++ указатель на такой тип базового класса можно использовать для вызова реализаций виртуальных функций, находящихся в объекте производного класса. Класс, содержащий виртуальные функции, иногда называется "полиморфным".
Поскольку производный класс содержит определения всех базовых классов, от которых он является производным, можно безопасно привести указатель с повышением по иерархии классов к любому из этих базовых классов. Для указателя на базовый класс можно безопасно выполнить приведение с понижением по иерархии. Эта операция безопасна, если объект, на который осуществляется указание, фактически имеет тип, производный от базового класса. В этом случае фактический объект, как говорят, является "полным объектом". Указатель на базовый класс, как сообщается, указывает на "подобъект" полного объекта. Например, рассмотрим иерархию классов, показанную на следующем рисунке.
Иерархия классов
Объект типа C
может быть визуализирован, как показано на следующем рисунке.
Класс C с подобъектами B и A
Для экземпляра класса C
имеются подчиненный объект B
и подчиненный объект A
. Экземпляр C
, содержащий подчиненные объекты A
и B
, является "полным объектом".
Используя информацию о типах во время выполнения, можно проверить, указывает ли указатель на полный объект и можно ли безопасно выполнить приведение этого указателя, чтобы он указывал на другой объект в своей иерархии. Оператор dynamic_cast можно использовать для создания этих типов приведения. Данный оператор также выполняет проверку во время выполнения, чтобы сделать эту операцию безопасной.
Для преобразования неполиморфных типов можно использовать оператор static_cast (в этом разделе объясняется различие между статическими и динамическими преобразованиями приведения, а также при необходимости их использования).
В этом разделе описываются следующие темы:
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по