为什么当我使用dynamic_cast时会发生此错误?

why this error happens when I use dynamic_cast?

本文关键字:错误 cast dynamic 为什么      更新时间:2023-10-16

我想向下投射一个对象,但它会导致"无法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了,在它存在的时间内,我不得不使用它的次数可能可以用一只手的手指来计算(还剩下几只手(。有些时间和地点是有用的(还有一些地方真的很重要(,但它们确实相当不寻常。