繁体   English   中英

为什么在异常处理中隐式转换可以从派生转换为基?

[英]Why implicit conversion works from derived to base in exception handling?

我了解到隐式转换不会在从floatintcharint等异常处理中执行。但是当我应用相同的逻辑时,在面试中被问到多态类时,他们说这是错误的。 因此,这是我尝试进行交叉检查的代码段,这确实是错误的。

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM