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();
}