Главная->Інформатика та програмування->Содержание->Проверка типа класса с помощью dynamic_cast

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. В противном случае он указывал на что-то другое.

 

30