我正在学习 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;
}
所以我认为 try catch 将允许函数执行并向我显示异常的内容,但我的编译器不会编译它。我正在使用 GNU GCC 的代码块。请帮助我并告诉我需要做什么才能让代码按我的预期运行。多谢。
dynamic_cast
只能转换为指针值或引用,这正是错误所告诉您的。
C++ 标准 5.2.7/1 美元起。
表达式dynamic_cast(v)的结果是将表达式v转换为类型T的结果。T应是完整类类型的指针或引用,或“指向cv void的指针”。
为了dynamic_cast
要在无法转换对象时引发异常,您需要强制转换为引用。将其更改为以下内容:
dynamic_cast<AA&>(a).aa();
// ^^^ cast to reference.
As 琼丝网 https://stackoverflow.com/a/17129771/845568指出dynamic_cast
总会抛出std::bad_cast http://en.cppreference.com/w/cpp/types/bad_cast当转换失败时。虽然std::bad_cast
源自std::exception
使用最适合预期失败条件的异常始终是一个好主意。这可以防止无意中将其他错误解释为不成功的转换。
要将其应用于您的示例,它可能类似于下面的代码。
#include <iostream>
#include <typeinfo> // std::bad_cast
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(const std::bad_cast& ex)
{
std::cout << "["<<ex.what()<<"]" << std::endl;
}
return 0;
}
[注意,做类似的事情using namespace std;
强烈建议不要这样做,因为它可能会导致与全局命名空间中的标识符发生冲突。我在上面的例子中删除了它。]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)