У вас есть несоответствие типов между ссылкой и указателем, поэтому код не должен компилироваться.Поскольку вы проверяете нулевой указатель, вы, очевидно, хотите иметь дело с указателями, поэтому код должен выглядеть примерно так:
class A{...}
class B: public A{...}
A& x;
if (dynamic_cast<B *>(&x))!=0)
// cast was successful
else
// cast wasn't successful
Вы также можете использовать ссылки везде, но если вы это сделаете,неудачное приведение передается с помощью исключения std::bad_cast
:
void f(A &a) {
try {
B &b = dynamic_cast<B &>(a);
b.do_something_specific_to_b();
}
catch (std::bad_cast const &b) {
// `a` wasn't of type `B`
}
}
Обратите внимание, однако, что dynamic_cast
в первую очередь полезен в таких случаях, когда вы получаете указатель / ссылку в качестве параметраили для таких вещей, как набор указателей, некоторые из которых могут указывать на различные типы:
std::vector<A *> objects;
for (auto const *a : objects) {
B *b = dynamic_cast<B *>(a);
if (b != nullptr)
b->do_B_specific_stuff();
else
a->do_generic_A_stuff();
}
Наконец, я хотел бы отметить, что если вы часто используете dynamic_cast
, шансы довольно великиХорошо, что ты делаешь что-то не так.Я использовал C ++ с тех пор, как существовал dynamic_cast
, и за время его существования число раз, когда мне приходилось его использовать, вероятно, можно было подсчитать по пальцам одной руки (с оставшейся парой).Бывают времена и места, где это полезно (а в некоторых случаях это действительно важно), но они действительно довольно необычны.