错误:无法进行动态\u转换。。。(目标不是指针或引用) 我学习C++中的异常处理,遇到了一个问题。代码如下: #include<iostream> #include<exception> using namespace std; class A { public: virtual void f(void){} }; class AA:public A { public: void aa(void){}; }; int main(void) { A a; try { dynamic_cast<AA>(a).aa(); } catch(exception ex) { cout<<"["<<ex.what()<<"]"<<endl; } return 0; } #包括 #包括 使用名称空间std; 甲级 { 公众: 虚空f(void){} }; AA类:公共A { 公众: 无效aa(无效){}; }; 内部主(空) { A A; 尝试 { 动态_cast(a.aa(); } 捕获(例外情况除外) { cout

错误:无法进行动态\u转换。。。(目标不是指针或引用) 我学习C++中的异常处理,遇到了一个问题。代码如下: #include<iostream> #include<exception> using namespace std; class A { public: virtual void f(void){} }; class AA:public A { public: void aa(void){}; }; int main(void) { A a; try { dynamic_cast<AA>(a).aa(); } catch(exception ex) { cout<<"["<<ex.what()<<"]"<<endl; } return 0; } #包括 #包括 使用名称空间std; 甲级 { 公众: 虚空f(void){} }; AA类:公共A { 公众: 无效aa(无效){}; }; 内部主(空) { A A; 尝试 { 动态_cast(a.aa(); } 捕获(例外情况除外) { cout,c++,exception,try-catch,dynamic-cast,C++,Exception,Try Catch,Dynamic Cast,由于您的dynamic\u cast不在指针或引用上,因此您得到了一个编译器错误。 将其更改为: dynamic_cast<AA&>(a).aa(); dynamic_cast(a.aa(); …然后会引发正确的异常 旁注:像g++这样的智能编译器也会发出警告: 警告:dynamic\u cast对对象(此处为a)的投射永远不会成功 因此,最好限制此类代码的使用。在产品质量代码中,dynamic\u cast应仅对指针/引用执行。dynamic\u cast只能对指针值或

由于您的
dynamic\u cast
不在指针或引用上,因此您得到了一个编译器错误。
将其更改为:

dynamic_cast<AA&>(a).aa();
dynamic_cast(a.aa();
…然后会引发正确的异常

旁注:像g++这样的智能编译器也会发出警告:
警告:
dynamic\u cast
对对象(此处为
a
)的投射永远不会成功


因此,最好限制此类代码的使用。在产品质量代码中,
dynamic\u cast
应仅对指针/引用执行。

dynamic\u cast
只能对指针值或引用执行强制转换,这正是错误告诉您的

从C++标准5.2.7/1美元。

表达式dynamic_cast(v)的结果是将表达式v转换为类型T的结果。T应是指向完整类类型的指针或引用,或“指向cv void的指针”

要使
dynamic\u cast
在对象无法转换时引发异常,您需要将其转换为引用。将其更改为以下内容:

dynamic_cast<AA&>(a).aa();
//           ^^^ cast to reference.
[注意,强烈反对使用命名空间std;之类的操作,因为这可能会导致与全局命名空间中的标识符冲突。我已在上面的示例中删除了它。]

您的问题不在于异常处理,而在于动态强制转换:

dynamic_cast
安全地将指针和引用转换为类,而不是实例

所以你可以做:

dynamic_cast<AA&>(a).aa();

进一步阅读:继续。

我刚刚处理了相同的错误,但在我的例子中,我是从一个指针转到一个指针,所以这里的其他答案不适用。但是,我的错误消息略有不同:
错误:无法动态地将“f()”(类型为“B*”)转换为“a*”类型(目标不是完整类型的指针或引用)

我的问题的根本原因要简单得多

注意末尾添加了to complete类型。这使我想起我没有包含我正在使用的类的头文件。它不是未知符号,因为
A*
在头文件中与
class A;
一起向前声明,导致它存在但不完整,因此出现错误

在我的例子中,解决方案是包含我要转换到的类的头文件


这不是上面提问者的问题,但从我的案例中可以看出,它可能会生成相同类型的错误。

您遇到了编译器错误。您必须在问题中分享该错误,这样您才能学会阅读和理解它们。当然。“无法将“a”(类型为“a类”)转换为“AA类”(目标不是指针或引用),这是这里的主要问题。
dynamic_cast
适用于指针或引用类型。
AA
不是指针或引用类型。因为您正在学习异常处理:捕获异常的最佳方法是通过常量引用-即
catch(const std::exception&ex)
将我的代码修改为后,程序输出[std::exception]。我如何进入std::bad_cast?请您用代码示例说明“使用最适合预期失败条件的异常总是一个好主意”好吗?thanks@focusHard,将一个
catch(std::bad_cast&e)
置于现有
catch()之上
block.And
#include
@focusHard
bad\u cast
位于
typeinfo
标题中。我已经更新了我的答案,对您的示例进行了必要的更改。您应该做的另一件事是开始使用它作为参考。它列出了相关的标题文件,并且通常提供了示例。当学习C++。我尝试按您的建议(STD::BADYCAST CONST和EX),但得到几个错误消息。“预期类型说明符”,“预期的不合格ID”之前“const”<代码>:ST::BADYCAST 定义在页眉<代码> <代码>中。
'AA' is not a reference or pointer
dynamic_cast<AA&>(a).aa();
catch (std::bad_cast const& ex)