Главная » Просмотр файлов » Г. Шилтд - Самоучитель C++ (PDF)

Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 54

Файл №1114887 Г. Шилтд - Самоучитель C++ (PDF) (Г. Шилтд - Самоучитель C++ (PDF)) 54 страницаГ. Шилтд - Самоучитель C++ (PDF) (1114887) страница 542019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 54)

18535^1. 898986. 70825. 196169. 539396. 4307461. Зачем нужна динамическая идентификация типа?2. Проведите эксперимент, о котором говорилось в примере 1. Что вы увидитена экране?3. Правилен ли следующий фрагмент программы?cout « t y p e i d ( f l o a t ) . n a m e ( ) ;4. Дан фрагмент программы. Как определить, является ли р указателем на объект типа D2?class В {virtual void f(} {}Самоучитель C++368'class Dl: public В (void f () {}class D2: public В {void f ( > { }i.int rnainOВ *р;5. По отношению к классу Мшп из примера 5 следующее выражение являетсяистинным или ложным?typeid(Num<int>) == typeid(Num<double>)6.

Поэкспериментируйте с RTTI. Хотя польза от динамической идентификациитипа в контексте приведенных здесь простых примеров может показаться неслишком очевидной, тем не менее это мощный инструмент упраачения объектами во время работы программы.12.2. Оператор dynamicjcastХотя в C++ продолжают поддерживаться характерные для языка С операторы приведения типов, имеется и несколько новых. Это операторы dynamic_cast, const_cast, reinterpret_cast и static_cast. Поскольку операторdynamic_cast имеет непосредственное отношение к динамической идентификации типа, мы рассмотрим его первым.

Остальные операторы приведения типов рассматриваются в следующем разделе.Оператор dynamic_cast реализует приведение типов в динамическом режиме,что позволяет контролировать правильность этой операции во время работыпрограммы. Если при выполнении оператора dynamic_cast приведения типовне произошло, будет выдана ошибка приведения типов. Ниже представленаосновная форма оператора dynamic_cast:dynamic сазЪ<целевой тип> (выражение)Здесь целевой_пшп — это тип, которым должен стать тип параметра выражение после выполнения операции приведения типов. Целевой тип долженбыть типом указателя или ссылки и результат выполнения параметра выражение тоже должен стать указателем или ссылкой. Таким образом, операторdynamic_cast используется для приведения типа одного указателя к типудругого или типа одной ссылки к типу другой.Основное назначение оператора dynamic_cast заключается в реализацииоперации приведения полиморфных типов.

Например, пусть дано два поли-Глава 12. Динамическая идентификация иприведеиие^гипов369морфных класса В и D, причем класс D является производным от класса В,тогда оператор dynamic_cast всегда может привести тип указателя D* к типууказателя В*. Это возможно потому, что указатель базового класса всегдаможет указывать на объект производного класса. Оператор dynamic_cast может также привести тип указателя В* к типу указателя D*, но только в томслучае, если объект, на который указывает указатель, действительно является объектом типа D.

Как правило, оператор dynamic__cast выполняется успешно, когда указатель (или ссылка) после приведения типов становитсяуказателем (или ссылкой) либо на объект целевого типа, либо на объектпроизводного от целевого типа. В противном случае приведения типов непроисходит. При неудачной попытке приведения типов результатом выполнения оператора dynamic_cast является нуль, если в операции использовались указатели. Если же в операции использовались ссылки, возбуждаетсяисключительная ситуация bad_cast.Рассмотрим простой пример.

Предположим, что Base — это базовый класс,a Derived — это класс, производный от класса Base.Base *bp, b_ob;Derived *dp, d_ob;bp = &d_ob; // указатель базового класса// указывает на объект производного классаdp = dynamic_cast<Derived *> (bp)if(!dp) cout "Приведение типов прошло успешно";Здесь приведение типа указателя bp базового класса к типу указателя dpпроизводного класса прошло успешно, поскольку указатель bp на самом деле указывает на объект производного класса Derived. Таким образом, послевыполнения этого фрагмента программы на экране появится сообщениеПриведение типов прошло успешно. Однако в следующем фрагменте операция приведения типов заканчивается неудачей, поскольку указатель bp указывает на объект базового класса Base, а приводить тип объекта базовогокласса к типу объекта производного класса неправильно.bp = Sb_ob; // указатель базового класса// указывает на объект базового классаdp = dynamic_cast<Derived *> (bp)if{!dp) cout "Приведения типов не произошло";Поскольку попытка приведения типов закончилась неудачей, на экран будетвыведено сообщение Приведения типов не произошло.Оператор dynamic_cast в некоторых случаях можно использовать вместооператора typeid.

Например, опять предположим, что Base — это базовыйкласс, a Derived — это класс, производный от класса Base. В следующемфрагменте указателю dp присваивается адрес объекта, на который указываетуказатель bp, но только в том случае, если это действительно объект классаDerived.370Самоучитель C++Base *bp;Derived *dp;// ...if(typeid(*bp) == typeid(Derived)) dp = (Derived *) bp;В данном примере для фактического выполнения операции приведения типов используется стиль языка С. Это безопасней, поскольку инструкция if спомощью оператора typeid проверяет правильность выполнения операцииеще до того, как она действительно происходит.

Тем не менее для этого естьболее короткий путь. Оператор typeid с инструкцией if можно заменить оператором dynamic cast:f—М.dp = dynamic_cast<Derived *> (bp)Поскольку оператор dynamic^cast заканчивается успешно только в том случае, если объект, к которому применяется операция приведения типов, является либо объектом целевого типа, либо объектом производного отцелевого типа, то после выполнения приведенной выше инструкции указатель dp будет либо нулевым, либо указателем на объект типа Derived.

Такимобразом, оператор dynamic_cast успешно завершается только при правильном приведении типов, а это значит, что в определенных ситуациях он может упростить логику программы.1. В следующей программе продемонстрировано использование оператора dynamic_cast:// Использование оператора dynamic_cast^include <iostream>using namespace std;class Base {public:virtual void f ( ) { cout « "Внутри класса Base"\n; }class Derived: public Base {public:void f ( ) { cout « "Внутри класса Derived"\n; }};intmain{)Base *bp, b_ob;Derived *dp, d ob;Глава 12.

Динамическая идентификация и приведение типов371dp = dynamic_cast<Derived *> (&d_ob);if(dp) {cout « "Тип Derived * к типу Derived * приведен успешно\п";dp->f О;} elsecout « "Ошибка\п";cout « endl;bp = dynamic__cast<Base *> (&d_ob);if(bp) {cout « "Тип Derived * к типу Base * приведен успешно\п";bp->f();} elsecout « "Ошибка\n";cout « endl;bp = dynamic_cast<Base *> (&b_ob);if(bp) {cout « "Тип Base * к типу Base * приведен успешно\п";bp->f();} elsecout « "ОшиОка\п";cout « endl;dp = dynamic_cast<Derived *> (sb_ob);if (dp) {cout « "Ошибка\п";} elsecout « "Тип Base * к типу Derived * не приведен\п";cout « endl;bp = &d_ob; // bp указывает на объект типа Deriveddp = dynamic cast<Derived *> (bp);if(dp) {cout « "Указатель bp к типу Derived * приведен успешно\п" «"поскольку Ьр в действительности указывает\п" «"на объект типа Derived\n";dp->f();} elsecout « "ОшибкаХп";cout « endl;bp = &b_ob; // bp указьгаает на объект типа Basedp = dynamic_cast<Derived *> (bp);if(dp)cout « "Ошибка\п";372_СамоучительC++else {cout « "Указатель Ьр к типу Derived * не приведен\п" «"поскольку Ьр в действительности указывает\п" «"на объект типа Вазе\п" ;cout « endl;dp = &d_ob; // dp указывает на объект типа Derivedbp = dynamic_cast<Base *> (dp) ;if(bp) {cout « "Указатель dp к типу Base * приведен успешно\п" «bp->f ( } ;) elsecout « "Ошибка \n";return 0;Программа выводит на экран следующую информацию:Тип Derived * к типу Derived * приведен успешноВнутри класса DerivedТип Derived * к типу Вазе * приведен успешноВнутри класса DerivedТип Base * к типу Derived * не приведенУказатель Ьр к типу Derived * приведен успешнопоскольку Ьр в действительности указываетна объект типа DerivedВнутри класса DerivedУказатель Ьр к типу Derived * не приведенпоскольку Ьр в действительности указываетна объект типа ВазеУказатель dp к типу Base * приведен успешноВнутри класса Derived2.

В следующем примере показано, как оператор typeid можно заменить оператором dynamic_cast./* Использование оператора dynaraic_cast для замены оператора typeid*/^include <iostream>Глава 12. Динамическая идентификация и приведение типов^include <typeinfo>using namespace std;class Base {public:virtual void f() (}};class Derived: public Base {public:void derivedOnly() {cout « "Это объект класса Derived"\n;int main()Base *bp, b_ob;Derived *dp, d_ob;// использование оператора typeidbp = &b_ob;if(typeid(*bp) = typeid(Derived)) {dp = (Derived *) bp;dp->derivedOnly();} elsecout « "Тип Base к типу Derived не приведен\п";bp - &d_ob;if(typeid(*bp) == typeid(Derived)} {dp = (Derived *) bp;dp->derivedOnly();} elsecout « "Ошибка, приведение типов должно работать!\п";// использование оператора dynamic_castbp = Sb_ob;dp = dynarnic_cast<Derived *> (bp) ;i f ( d p ) dp->derivedOnly(};elsecout « "Тип Base к типу Derived не приведен\п";bp = sd_ob;dp = dynamic_cast<Derived *> (bp);373374Самоучительi f ( d p ) dp->derivedOnly{);elsecout « "Ошибка, приведение типов должно работать!\п";return 0;Как видите, использование оператора dynamic_cast делает проще логику приведения типа указателя базового класса к типу указателя производного класса.

После выполнения программы на экран будет выведена следующаяинформация:ТипЭтоТипЭтоBase кобъектBase кобъекттипу Derived не приведенкласса Derivedтипу Derived не приведенкласса Derived3. Оператор dynamic_cast, как и оператор typeid, можно использовать с классами-шаблонами. Например, в следующем примере представлен переработанный класс-шаблон из примера 5 раздела 12.1. Здесь тип объекта,возвращаемый функцией genegator(), определяется с помощью оператора dynamic_cast.// Использование оператора dynamic_cast с шаблонами^include <iostream>^include <cstdlib>^include <cmath>#include <typeinfo>using namespace std;template <class T> class Num {public:Т x;Num(T i) { x = i; }virtual Т get_val() { return x; }template <class T>class Squary: public Num<T> {public:Squary(T i): Num<T>(i) {}Т get_val() { return x*x; }1;template <class T>class Sqr_root: public Num<T> {public:Sqr_root(T i ) : Num<T>{i} ( }Т get_val(} { return sqrt((double) x}; }Глава 12.

Характеристики

Тип файла
PDF-файл
Размер
65,55 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее