![]() |
|
Программирование >> Расширенная версия языка c++
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 ;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |