(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;