我想向下转换一个对象,但它会导致'can not dynamic_cast'错误..(源不是类类型)
问题是什么??
这是我的代码,
class A{...}
class B: public A{...}
A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)
只有dynamic_cast
类类型可以作为参考。
问题是什么??
正如错误所说,&x
表达式的结果不是类类型。它是一种指针类型。你试图将dynamic_cast
指向一个引用。这是不可能的。
引用和指针之间的类型不匹配,因此代码不应该编译。因为你正在检查一个空指针,你显然想要处理指针,所以代码应该是这个通用顺序的东西:
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
存在之前,在它存在的时候,我必须使用它的次数可能是用一只手的手指计算的(剩下一对)。有时候和地方有用(以及一些非常重要的地方),但它们确实很不寻常。