![]() |
|
Программирование >> Расширенная версия языка c++
морфных класса В и D, причем класс D является производным от класса В, тогда оператор dynamic cast всегда может привести тип указателя D* к типу указателя В*. Это возможно потому, что указатель базового класса всегда может указывать на объект производного класса. Оператор ic cast может также привести тип указателя В* к типу указателе D*, но только в том случае, если объект, на который указывает указатель, действительно является объектом типа D. Ка мило, оператор mic cast: выполняется успешно, когда указатель (или ссылка) после приведения типов становится указателем (или ссылкой) либо на объект целевого типа, либо на объект производного от целевого типа. В противном случае приведения типов не происходит. При неудачной попытке приведения типов результатом выполнения оператора ic cast является нуль, если в операции использовались указатели. Если же в операции использовались ссылки, возбуждается исключительная ситуация bad cast. ,;: j.., -,~r . 1. Рассмотрим простой пример. Предположим, что Base - это базовый класс, a Derived - это класс, производный от класса Base. Т-Ч1 : Base *Ьр, Ь оЬ; Derived *dp, dob; bp ob; указатель базового класса 1 - указывает на объект производного класса .,* Ii -.к,-dp = dynamic cast<Derived *> (bp) if(!dp) cout Приведение типов прошло успешно ; Здесь приведение типа указателя bp базового класса к типу указателя dp производного класса прошло успешно, поскольку указатель bp на самом деле указывает на объект производного класса Derived. Таким образом, после вхполнения этого фрагмента программы на экране появится сообщение Приведение типов проо успешно. Однако в следующем фрагменте операция приведения типов заканчивается неудачей, поскольку указатель bp указывает на объект базового класса Base, а приводить тип объекта базового класса к типу объекта производного класса неправильно. bp = указатель базового класса указывает на объект базового класса dp = dynamic cast<Derived *> (bp) if{!dp) cout Приведения типов не произошло ; Поскольку попытка приведения типов закончилась неудачей, на экран будет выведено сообщение Приведения типов не произошло. Оператор mic cast в некоторых случаях можно использовать вместо оператора typeid. Например, опять предположим, что Base - это базовый класс, а Derived - это класс, производный от класса Base. В следующем фрагменте указателю dp присваивается адрес на который указывает указатель bp, но только в том случае, если это действительно объект класса Derived. Примвры 1. В следующе!! программе продемонстрировано использование оператора dy-nainic cast: Использование оператора dynamic cast ftinclude <io3tream> . -. using namespace std; . class Base ( . . , public; virtual void f() { cou Внутри класса \n; } ); , , . class Derived: public Base { public: void f() { cou Внутри класса ed \n; } int mainO -- j;- , . - .-t Base *bp, b ob; .. i .- Derived Mp, d ob; Base *Ьр; , .. , , у. . Derived *dp,- - . . . : - ,-; ,. г-
if (typeid(*bp) == typeid (Derived) ) dp = (Derived *) bp; В данном примере для фактического выполнение аиии приведения типов используется стиль язхка С. Это безопасней, поскольку укция if с помощью оператора typeid проверяет правильность выполнения операции еще до того, как она действительно происходит. Тем не менее для этого есть более короткий путь. Оператор typeid с инструкцией if можно заменить оператором dynamic cast: , .v dp St<Derived *> (bp) Поскольку оператор mic cast заканчивается успешно только в том случае, если объект, к которому применяется операция приведения типов, является либо объектом целевого типа, либо объектом производного от целевого типа, то после выполнения приведенной выше инструкции указатель dp будет либо нулевым, либо указателем на объект типа Derived. Таким образом, оператор dynamicjcast успешно завершается только при правильном приведении типов, а это значит, что в определенных ситуациях он может упростить логику программы. cout endl; bp bp на объект типа Base if(dp) cout dp st<Derived *> (id ob); if(dp) { cou Тип Derived * к ти Derived * приведен успешноХп ; dp->f О; } else cout cout endl; bp *> if (bp) { , .,: cout ТЖ1 Derived * к типу Base * приведен успешно\n ; bp->f(),- } else cout cou endl; bp caSt<Base *> (iboto); if (bp) { cou Т Base * к типу Base * приведен ycneiCHo\n ; bp->f{); } else cout Ошибка\n ; cout endl; dp = dynaraic cast<Derived *> (sb Qb); if () { cout } else cout Тип Base * к типу Derived * не приведен\п ; cout bp = ob; bp указывает на объект типа Derived dp = dynamic cast<Derlved *> (bp); .. if(dp) { cou Указатель bp к ти Derived * приведен успещмо\п поскольку Ьр в действительности указывает\п н ект типа DerivedNn ; dp->f(); } else cout Ошибка\п ;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |