![](/img/trans.png)
[英]Why static_cast conversion from base to derived works inside base but not outside
[英]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&,并且E和T是同一类型(忽略顶级cv限定词),或者
处理程序是cv T或cv T&类型,并且T是E的明确公共基类 ,或者
处理程序的类型为cv T或const T&,其中T是指针或指针成员类型,E是指针或指针成员类型,可以通过以下一种或多种方式将其转换为T
标准指针转换,不包含对指向私有或受保护或模棱两可类的指针的转换
函数指针转换
资格转换,或
处理程序的类型为cv T或const T&,其中T是指针或成员指针类型,E是std :: nullptr_t。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.