ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Проверка типа класса с помощью dynamic_cast
Допустим, некая внешняя программа передает в вашу программу объект (так
любит делать операционная система с функцией обратного вызова). Предполага-
ется, что объект принадлежит какому-то известному классу, но вам хочется про-
верить это. Как это сделать? Как определить класс объекта? Оператор dynamic_
cast позволяет это сделать, предполагая, что классы, чьи объекты вы хотите про-
верить, все вышли из гоголевской «Шинели», то есть имеют общий базовый
класс. Этот подход демонстрируется в программе DYNCAST1:
Листинг 11.23. Программа DYNCAST1
//dyncast1.cpp
//динамическое приведение типов для проверки типа объекта
//RTTI должен быть включен
#include <iostream>
#include <typeinfo> //для dynamic_cast
using namespace std;
///////////////////////////////////////////////////////////
class Base
{
virtual void vertFunc() //для dynamic cast
{ }
};
class Derv1 : public Base
{ };
class Derv2 : public Base
{ };
Листинг 11.23 (продолжение)
///////////////////////////////////////////////////////////
//проверка, указывает ли pUnknown на Derv1
bool isDerv1(Base* pUnknown) //неизвестный подкласс базового
{
Derv1* pDerv1;
if( pDerv1 = dynamic_cast<Derv1*>(pUnknown) )
return true;
else
return false;
}
//---------------------------------------------------------
int main()
{
Derv1* d1 = new Derv1;
Derv2* d2 = new Derv2;
if( isDerv1(d1) )
cout << "d1 – компонент класса Derv1\n";
else
cout << "d1 – не компонент класса Derv1\n";
if( isDerv1(d2) )
cout << "d2 - компонент класса Derv1\n";
else
cout << "d2 – не компонент класса Derv1\n";
return 0;
}
У нас есть базовый класс Base и два порожденных — Dervl и Derv2. Есть также
функция isDerv1(), возвращающая значение «истина», если указатель, переданный
в качестве аргумента, указывает на объект класса Derv1. Наш аргумент принад-
лежит классу Base, поэтому объекты могут быть либо класса Derv1, либо Derv2.
Оператор dynamic_cast пытается привести указатель неизвестного типа pUnknown
к типу Derv1. Если результат ненулевой, значит, pUnknown указывал на объект
Derv1. В противном случае он указывал на что-то другое.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Схожі підручники
- Індивідуальна робота з курсу «Інвестування»
- Структура кредитного портфелю українських банків, недоліки та перспективи покращення
- Конспект лекцiй регiональна економiка
- Загальні питання з курсу Безпека життєдіяльності №2 (частина 2)
- Загальні питання з курсу Соціологія (частина 1)
- Продажи и управление продажами Учеб. пособие для вузов (часть 5) (онлайн)
