C ++继承混乱

时间:2019-11-08 14:18:20

标签: c++ inheritance

#include<iostream>

using namespace std;

class Base{};

class Derived : public Base{};

int main() {
    Derived d;
    try {
        throw d;
    }

    catch(Base b) {
        cout << "1";
    }
    catch(Derived d) {
        cout << "2";
    }
    return 0;
}

为什么该程序显示输出1而不显示2?如果我抛出了Base类对象,并且输出为2,则不会有任何问题,因为派生类是具有附加功能的基类。但这是另一回事吗?

1 个答案:

答案 0 :(得分:3)

尝试..捕获块始终将基类作为优先级。

如果早期的catch块处理的基类具有在下面显示的catch块中处理的派生类,则这些派生类的catch块将永远不会命中-它是以此方式设计的。

我可以举一个std :: exception类的例子

假设您扩展了一个异常类:

save()

在上面的示例中,投掷将永远不会被第二个接球挡住-永远不会

class AlgoException : public std::exception {}

try
{
    throw AlgoException ();
}
catch (std::exception) { std::cout << 1; }
catch (AlgoException ) { std::cout << 2; }

如果执行上述操作,则它将打印'2'-这是在try .. catch块中处理异常时的良好编程习惯的方法。我们应该将基类catch块保留在所有派生类catch块之下。

try
{
    throw AlgoException ();
}
catch (AlgoException ) { std::cout << 2; }
catch (std::exception) { std::cout << 1; }

如果执行上述操作,则它将永远不会打印“ 3”,而只会打印“ 2”

  

基类catch块必须出现在其派生类的最下方   捕获块。