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

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


372 Самоучитель С++

else { - - -

cout Указатель bp к тищ Derived * не приведенХп

поскольку bp в действительности укаэываетЧп на объект типа Base\n ;

cout endl;

dp ob; dp указывает на объект типа Derived bp = dYnamic cast<Base *> (dp) ;

if (bp) {

cout Указатель dp к типу Base * приведен успешно\п bp->f();

) else

cout ОшибкаХп ?

return 0;

Программа выводит на экран следующую информацию:

Тип Derived * к ти Derived * иведен успело Внутри класса Derived

Derived * к тип se * приведен успешно . . .

Внутри класса Derived

Тип Base * к типу Вазе * приведен успешно

Внутри класса Вазе .

Тип Base * к типу Derived * не приведен

Указателе:-!!-: к типу Derived * приведен успешно поскольк:>}: в действительности указывает

на объект типа Derived Внутри класса Derived

Указатель к типу Derived * не приведен

поскольку bp Б дейстБительности указывает /.. на объект типа Base ...

Указатель dp к типу Base * успешно

Внутри класса Derived

2. В следующем примере показано, как оператор eid можно заменить оператором dyaamiccast.

Использование оператора ic cast для замен1 оператора typeid

tinclude <iQStreain> u - . ..ц--



ttinclude <typeinfo>

using namespace

Base {

public: .. .

virtual void f() (J

}; - .

class Derived: public Base {

public: . -- -,1 , iji.-;

voi dOnlyO { ; .

cou Это объект класса Derived \n;

int itiainO , i T ,

Base *bp, b ob; * 6 . ,- Ai. nj -c .м-,и-ч. -

Derived *dp, d ob; x ; - :(-;rsi:J! ! 41-:

использование оператора typeid bp = &b ob;

if (typeid (*bp) == typeid (Derived) ) { ..- . . j;,.. .

dp = (Derived *) bp;

dp->derivedOnly () ; , ...

} else

cou Тип Base к типу Derived не приведен\п ; bp - {id ob;

== {

dp = (Derived *) bp;

dp->deriveduny () ; , - =

} else

cou << Сбка, приведение типов должно работать!\n ;

11 il-*Tt********** + A + + 7. 4AT>f*rfr*** + *n-#* + * + + * + Ж * * * ТЧ к -k.ftiftcit

использование оператора bp = Sb ob;

dp = dynamic cast<Derived *> (bp) ;

if(dp) dp->derivedOnly();

else

cout Tm Base к типу Derived не приведен\п ; ;

bp =

dp = dynamic cast<Derived *> (bp) ;



return 0;

Как видите, использование оператора ic cast делает проще логику приведения типа указателя базового класса к типу указателя производного класса. После выполнения программы на экран будет выведена следующая

информация:

Тип Base к типу Derived не приведен

Это объект класса Derived

Тип Base к типу Derived не приведен

Это объект класса Derived

3. Оператор dynamic cast, как и оператор eid, можно использовать с классами-шаблонами. Например, в следующем примере представлен переработанный класс-шаблон из примера 5 раздела 12.1. Здесь тип объекта, возвращаемый функцией genegator(), определяется с помощью оператора dy-nainic cast.

атора dynamic cast с шаблонами #include <iostream> -

ttinclude <cstdlib> --*

ttinclude <cmath> .

finclude <typeinfo>

using namespace std; .

template <class T> clasш[l { < -.

public: ...

Т x; ->. -

Num(T i) { X = i; ) ... l-s. . -:-

virtual T get val () { return x; } \ jv

1; - .

template <class T>

Class Squary: public Num<T> {

public:

Sary(T i) : Num<T>(i) ()

al() { return x; } ,

template <class T>

class Sqr root: public Ш1<Т> {

public:

Sqr root(T i): Num<T>(i) {) valO { return uble) x) ; }

if (dp) dp->derivedOnly О;

else -

cout Ошибка, приведение типов должно работать ! \n ;



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

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