为什么隐式转换在异常处理中从派生到基?
Why implicit conversion works from derived to base in exception handling?
我了解到隐式转换不会在异常处理中执行,例如从float
到int
或char
到int
等。但是当我在采访中被问到多态类时,当我应用同样的逻辑时,他们说这是错误的。所以这是我试图交叉检查的片段,它确实是错误的。
#include<iostream>
using namespace std;
class base
{
public:
virtual void what()
{
cout<<"caught in base"<<endl;
}
};
class derived : public base
{
public:
void what()
{
cout<<"caught in derived"<<endl;
}
};
void f()
{
throw derived(); // throwing instance of derived
}
void fprim()
{
throw 10.20f; // throwing float
}
int main()
{
try
{
f();
}
catch(base b)
{
cout<<"in base catch"<<endl;
b.what();
}
catch(derived d) // supposed to caught here
{
cout<<"in derived catch"<<endl;
d.what();
}
// worked perfectly fir primitive
try
{
fprim();
}
catch(int i)
{
cout<<"in int catch"<<endl;
}
catch(float f)
{
cout<<"in float catch"<<endl;
}
return 0;
}
输出
in base catch
caught in base
in float catch
Press <RETURN> to close this window...
我期望输出中的第一行应该形成派生的 catch 语句。
那么有人可以告诉我为什么以及如何在这里进行隐式转换吗?
特别指出,允许基类的处理程序处理派生类的异常。
引自 [except.handle]/3:
处理程序是类型 E 的异常对象的匹配项,如果
处理程序的类型为 cv T 或 cv T
- 处理程序的类型为 cv T 或
& 并且 E 和 T 是同一类型(忽略顶级 cv 限定符),或者
cv T& 和 T 是 E 的明确公共基类,或
处理程序的类型为 cv T 或 const T&,其中 T 是指针或指向成员的类型,E 是指针或指向成员的类型,可以通过一个或多个转换为 T
标准指针转换,不涉及转换为指向私有类、受保护类或不明确类的指针
函数指针转换
资格转换,或
处理程序的类型为 cv T 或 const T& 其中 T 是指向成员的指针或指针类型,E 是 std::nullptr_t。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 无法引发 CException 派生异常?
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C++异常处理如何处理异常派生类