dynamic_cast
работает ТОЛЬКО с полиморфным классом. И класс polymorphic
- это класс, который имеет хотя бы одну функцию virtual
, даже если это деструктор.
//polymorphic classes
struct A
{
virtual ~A(); //even virtual destructor makes a class polymorphic!
};
struct B : A
{
void f();
};
//non-polymorphic classes
struct C
{
~C(); //not virtual
};
struct D : C
{
void f(); //not virtual either
};
В приведенном выше коде A
и B
являются полиморфными классами, а C
и D
- нет.
A *pA = new B();
B *pB = dynamic_cast<B*>(pA); //okay
C *pC = new D();
D *pD = dynamic_cast<D*>(pC); //error - not polymorphic class
Обратите внимание, что в dynamic_cast
только тип источника должен быть полиморфным для компиляции. Если пункт назначения не полиморфный , то dynamic_cast
вернет нулевой указатель.
D *pD = dynamic_cast<D*>(pA); //okay - source (pA) is polymorphic
if ( pD )
cout << "pD is not null" ;
else
cout << "pD is null";
Выход:
pD is null
Онлайн демо: https://web.archive.org/web/20000000000000/http://www.ideone.com/Yesxc