Язык программирования C++. Вводный курс


Класс type_info - часть 3


/p>

}

Если dynamic_cast

завершается успешно, то оператор typeid вернет объект класса extended_type_info, т.е. компилятор обеспечивает расширенную поддержку RTTI, чем программа может воспользоваться. В противном случае допустимы только базовые средства RTTI.

Упражнение 19.1

Дана иерархия классов, в которой у каждого класса есть конструктор по умолчанию и виртуальный деструктор:

class X { ... };

class A { ... };

class B : public A { ... };

class C : public B { ... };

class D : public X, public C { ... };

Какие из данных операторов dynamic_cast

завершатся неудачно?

(a) D *pd = new D;

    A *pa = dynamic_cast< A* > ( pd );

(b) A *pa = new C;

    C *pc = dynamic_cast< C* > ( pa );

(c) B *pb = new B;

    D *pd = dynamic_cast< D* > ( pb );

(d) A *pa = new D;

    X *px = dynamic_cast< X* > ( pa );

Упражнение 19.2

Объясните, когда нужно пользоваться оператором dynamic_cast вместо виртуальной функции?

Упражнение 19.3

Пользуясь иерархией классов из упражнения 19.1, перепишите следующий фрагмент так, чтобы в нем использовался ссылочный вариант dynamic_cast для преобразования *pa в тип D&:

if ( D *pd = dynamic_cast< D* >( pa ) ) {

   // использовать члены D

}

else {

   // использовать члены A

}

Упражнение 19.4

Дана иерархия классов, в которой у каждого класса есть конструктор по умолчанию и виртуальный деструктор:

class X { ... };

class A { ... };

class B : public A { ... };

class C : public B { ... };

class D : public X, public C { ... };

Какое имя типа будет напечатано в каждом из следующих случаев:

(a) A *pa = new D;

    cout << typeid( pa ).name() << endl;

 

(b) X *px = new D;

    cout << typeid( *px ).name() << endl;

 

(c) C obj;

    A& ra = cobj;

    cout << typeid( &ra ).name() << endl;

 

(d) X *px = new D;

    A& ra = *px;

    cout << typeid( ra ).name() << endl;




Начало  Назад  Вперед



Книжный магазин