if(dp) cout << "Приведение типа прошло успешно!";

Здесь приведение указателя bp (на базовый класс) к указателю dp (на производный класс) успешно выполняется, поскольку bp действительно указывает на объект класса Derived. Поэтому при выполнении этого фрагмента кода будет выведено сообщение Приведение типа прошло успешно!. Но в следующем фрагменте кода попытка совершить операцию приведения типа будет неудачной, поскольку bp в действительности указывает на объект класса Base, и неправомерно приводить указатель на базовый класс к типу указателя на производный, если адресуемый им объект не является на самом деле объектом производного класса.

bp = &b_ob; /* Указатель на базовый класс ссылается на объект класса Base. */

dp = dynamic_cast (bp); // ошибка!

if(!dp) cout << "Приведение типа выполнить не удалось";

Поскольку попытка выполнить операцию приведения типа оказалась неудачной, при выполнении этого фрагмента кода будет выведено сообщение Приведение типа выполнить не удалось.

В следующей программе демонстрируются различные ситуации применения оператора dynamic_cast.

// Использование оператора dynamic_cast.

#include

using namespace std;

class Base {

 public:

  virtual void f() { cout << "В классе Base.\n"; }

  // . . .

};

class Derived : public Base {

 public:

  void f() { cout << "В классе Derived.\n"; }

};

int main()

{

 Base *bp, b_ob;

 Derived *dp, d_ob;

 dp = dynamic_cast (&d_ob);

 if(dp) {

  cout << "Приведение типов " <<"(из Derived * в Derived *) реализовано.\n";

  dp->f();

 }

 else  cout <<"Ошибка\n";

 cout << endl;

 bp = dynamic_cast (&d_ob);

 if(bp) {

  cout << "Приведение типов " <<"(из Derived * в Base *) реализовано.\n";

  bp->f();

 }

 else  cout << "Ошибка\n";

 cout << endl;

 bp = dynamic_cast (&b_ob);

 if(bp) {

  cout << "Приведение типов " <<"(из Base * в Base *) реализовано.\n";

  bp->f();

 }

 else  cout << "Ошибка\n";

 cout << endl;

 dp = dynamic_cast (&b_ob);

 if(dp) cout <<"Ошибка\n";

 else

  cout <<"Приведение типов " <<"(из Base * в Derived *) не реализовано.\n";

 cout << endl;

 bp = &d_ob; // bp указывает на объект класса Derived

 dp = dynamic_cast (bp);

 if(dp) {

  cout << "Приведение bp к типу Derived *\n" << "реализовано, поскольку bp действительно\n" << "указывает на объект класса Derived.\n";

  dp->f();

 }

 else  cout << "Ошибка\n";

 cout << endl;

 bp = &b_ob; // bр указывает на объект класса Base

 dp = dynamic_cast (bp);

 if(dp) cout << "Ошибка";

 else {

  cout <<"Теперь приведение bp к типу Derived *\n" <<"не реализовано, поскольку bp\n" <<"в действительности указывает на объект\n" <<"класса Base.\n";

 }

 cout << endl;

 dp = &d_ob; // dp указывает на объект класса Derived

 bp = dynamic_cast (dp);

 if(bp) {

  cout <<"Приведение dp к типу Base * реализовано.\n";

  bp->f();

 }

 else  cout <<"Ошибка\n";

 return 0;

}

Программа генерирует такие результаты.

Приведение типов (из Derived* в Derived*) реализовано.

В классе Derived.

Приведение типов (из Derived* в Base*) реализовано.

В классе Derived.

Приведение типов (из Base* в Base*) реализовано.

В классе Base.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги