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

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Изменение типов указателей с помощью dynamic_cast

Оператор dynamic_cast позволяет осуществлять приведение типов «вверх» и «вниз»

по генеалогическому дереву классов. Но его возможности имеют некоторые ог-

раничения. Покажем в программе DYNCAST2 порядок работы с этим оператором.

Листинг 11.24. Программа DYNCAST2

//dyncast2.cpp

//Тестирование динамического приведения типов

//RTTI должен быть включен

#include <iostream>

#include <typeinfo>          //для dynamic_cast

using namespace std;

///////////////////////////////////////////////////////////

class Base

 

  {

  protected:

    int ba;

  public:

    Base() : ba(0)

      {  }

    Base(int b) : ba(b)

      {  }   

    virtual void vertFunc()  //для нужд dynamic_cast

      {  }

    void show()

      { cout << "Base: ba=" << ba << endl; }

  };

///////////////////////////////////////////////////////////

class Derv : public Base

  {

  private:

    int da;

  public:

    Derv(int b, int d) : da(d)

      { ba = b; }

    void show()

      { cout << "Derv: ba=" << ba << ", da=" << da << endl; }

  };

////////////////////////////////////////////////////////////////

int main()

{

  Base* pBase = new Base(10);     //указатель на Base

  Derv* pDerv = new Derv(21, 22); //указатель на Derv

 

  //приведение к базовому типу: восхождение  по дереву –

  //указатель поставлен на подобъект Base класса Derv

  pBase = dynamic_cast<Base*>(pDerv);

  pBase->show();                  //"Base: ba=21"

 

  pBase = new Derv(31, 32);       //обычное нисходящее

   //приведение типов -- pBase должен указывать на Derv)

  pDerv = dynamic_cast<Derv*>(pBase);

  pDerv->show();                  //"Derv: ba=31, da=32"

  return 0;

}

 

В этом примере у нас есть базовый и порожденный классы. В каждый из них

мы ввели элемент данных для лучшей демонстрации эффекта динамического

приведения типов.

При восходящем приведении типов производится попытка изменить объект

порожденного класса на объект базового класса. Все, что вы при этом можете

получить, — это только унаследованная из базового класса часть объекта порож-

денного. В нашем примере мы создали объект класса Derv. Ему в наследство от

базового класса досталась переменная ba, которая, будучи в базовом классе, име-

ла значение 10, а в порожденном классе имела значение 21. После приведения

типов указатель pBase стал ссылаться на базовую часть объекта класса Derv1, по-

этому на экране мы видим: Base:ba=21. Восходящее приведение типов целесооб-

разно использовать, когда вам нужно получить базовую составляющую объекта.

 

При нисходящем приведении типов мы переносим ссылку на объект порож-

денного класса из указателя базового класса в указатель порожденного.

 

31