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

问题描述 投票:-5回答:2

我想向下转换一个对象,但它会导致'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)
c++ dynamic-cast
2个回答
1
投票

只有dynamic_cast类类型可以作为参考。

问题是什么??

正如错误所说,&x表达式的结果不是类类型。它是一种指针类型。你试图将dynamic_cast指向一个引用。这是不可能的。


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,那么你做错事的可能性很大。我已经使用过C ++,因为在dynamic_cast存在之前,在它存在的时候,我必须使用它的次数可能是用一只手的手指计算的(剩下一对)。有时候和地方有用(以及一些非常重要的地方),但它们确实很不寻常。

© www.soinside.com 2019 - 2024. All rights reserved.