Поделиться через


Приведение

Если класс является производным от базового класса, содержащего виртуальные функции, то в языке C++ указатель на такой тип базового класса можно использовать для вызова реализаций виртуальных функций, находящихся в объекте производного класса. Класс, содержащий виртуальные функции, иногда называется "полиморфным".

Поскольку производный класс содержит определения всех базовых классов, от которых он является производным, можно безопасно привести указатель с повышением по иерархии классов к любому из этих базовых классов. Для указателя на базовый класс можно безопасно выполнить приведение с понижением по иерархии. Эта операция безопасна, если объект, на который осуществляется указание, фактически имеет тип, производный от базового класса. В этом случае говорят, что фактический объект является "полным". Говорят, что указатель на базовый класс указывает на "подчиненный объект" полного объекта. Например, рассмотрим иерархию классов, показанную на следующем рисунке.

Иерархия классов

Иерархия классов

Объект типа C может быть визуализирован, как показано на следующем рисунке.

Класс В с подобъектами Б и А

Класс C с подобъектами B и A

Для экземпляра класса C имеются подчиненный объект B и подчиненный объект A. Экземпляр C, содержащий подчиненные объекты A и B, является "полным объектом".

Используя информацию о типах во время выполнения, можно проверить, указывает ли указатель на полный объект и можно ли безопасно выполнить приведение этого указателя, чтобы он указывал на другой объект в своей иерархии. Для выполнения преобразований этого типа можно использовать оператор dynamic_cast. Данный оператор также выполняет проверку во время выполнения, чтобы сделать эту операцию безопасной.

Для преобразования неполиморфных типов можно использовать оператор static_cast (в данном разделе описываются различия между статическим и динамическим преобразованиями путем приведения и указывается, когда следует использовать каждое из этих преобразований).

Данный раздел охватывает следующее:

См. также

Ссылки

Выражения (C++)