我想向下转换对象,但是会导致“无法dynamic_cast”错误。 (源不是类类型的)
出什么问题了?
这是我的代码,
class A{...}
class B: public A{...}
A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)
答案 0 :(得分:1)
只能将类类型dynamic_cast
引用到引用。
出什么问题了?
正如错误所述,&x
表达式的结果不是类类型。它是指针类型。您试图dynamic_cast
指向引用的指针。那是不可能的。
答案 1 :(得分:0)
在引用和指针之间的类型不匹配,因此不应编译代码。由于您要检查空指针,因此您显然要处理指针,因此代码应按以下一般顺序进行处理:
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
,那么您做错事的机会就很大。我从dynamic_cast
出现之前就开始使用C ++,在它存在的时候,我可能不得不用它的次数可以用一只手的手指数(剩下的几对) 。在某些时候和地方有用(在某些地方它确实很重要),但它们确实是很不寻常的。