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

C++ 为什么在使用dynamic_cast时会发生此错误?,c++,dynamic-cast,C++,Dynamic Cast,我想向下投射对象,但它会导致“无法动态投射”错误。。 (源不是类类型) 有什么问题吗 这是我的密码 class A{...} class B: public A{...} A& x; dynamic_cast<B&>(&x))!=0 //error here (source is not of class type) A类{…} B类:公共A{…} A&x; 动态_cast(&x))=0//此处出错(源不是类类型) 只能将类类型动态转换为引用 有什么问

我想向下投射对象,但它会导致“无法动态投射”错误。。 (源不是类类型)

有什么问题吗

这是我的密码

class A{...}

class B: public A{...}


A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)
A类{…}
B类:公共A{…}
A&x;
动态_cast(&x))=0//此处出错(源不是类类型)

只能将类类型动态转换为引用

有什么问题吗


正如错误所说,
&x
表达式的结果不是类类型。它是指针类型。您试图
dynamic\u cast
指向引用的指针。这是不可能的。

引用和指针之间的类型不匹配,因此代码不应编译。由于您正在检查空指针,因此显然需要处理指针,因此代码应按以下一般顺序编写:

class A{...}

class B: public A{...}


A& x;
if (dynamic_cast<B *>(&x))!=0)
    // cast was successful
else
    // cast wasn't successful
但是,请注意,
dynamic\u 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();
}
std::向量对象;
用于(自动常量*a:对象){
B*B=动态_型铸造(a);
如果(b!=nullptr)
b->做特定的东西();
其他的
a->do_generic_a_a_stuff();
}

最后,我要指出的是,如果你发现自己经常使用
dynamic\u cast
,很可能你做错了什么。我使用C++,因为在代码>动态DealCysCase<代码>之前,在它存在的时候,我不得不使用它的次数可能会用一只手的手指(一对夫妇遗留下来)来计算。在某些时候和某些地方它是有用的(也有一些地方它是非常重要的),但它们确实是相当不寻常的<代码>x是一个参考。不是类实例。除了在别处指出的指针/引用问题外,这里的类定义显然是不合法的。这可能会隐藏其他问题。特别是,如果
A
没有虚拟函数,则
动态转换
无效。当然,
x
尚未初始化,因此,代码无法编译。简言之:总结太多。发布你能想出的编译并显示问题的最小代码。
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();
}