Программирование >>  Расширенная версия языка c++ 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 227


морфных класса В и 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 Ошибка\п ;



1 ... 118 119 120 [ 121 ] 122 123 124 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика