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

时间:2018-09-16 14:26:25

标签: c++ dynamic-cast

我想向下转换对象,但是会导致“无法dynamic_cast”错误。 (源不是类类型的)

出什么问题了?

这是我的代码,

class A{...}

class B: public A{...}


A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)

2 个答案:

答案 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 ++,在它存在的时候,我可能不得不用它的次数可以用一只手的手指数(剩下的几对) 。在某些时候和地方有用(在某些地方它确实很重要),但它们确实是很不寻常的。