异常多重继承

wit*_*osx 5 c++ inheritance exception multiple-inheritance

我遇到混合异常和多重继承的问题。基本上我有这个代码:

#include <exception>
#include <stdexcept>
#include <iostream>

class A : public std::exception
{
public:
    virtual ~A() noexcept {};
};

class B : public A, public std::runtime_error
{
public:
    B() : A{}, std::runtime_error{""}
    {

    }
};

int main()
{
    try {
        throw B{};
    } catch (const std::exception& error) {
        // this catch doesn't work
        std::clog << "Caught!" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是修改它,以便可以将 B 类的异常捕获为 std::exception (现在调用终止处理程序)。我怎样才能实现这样的行为?我猜想需要虚拟继承,但在这种情况下我看不到任何使用它的方法。

更新:我需要能够:
- 将 A 捕获为 A (微不足道),
- 将 A 捕获为 std:: 异常,
- 将 B 捕获为 B (再次,微不足道),
- 将 B 捕获为 std:: 异常,
- 将 B 捕获作为 std::runtime_error

我知道这是很多要求,也许没有多大意义,但我需要它,我只是好奇:)

UPDATE2:我认为问题是 std::runtime_error 实际上不是从 std::exception 派生的(这将允许我通过 A 中的虚拟继承来解决问题)。我对吗?不过,还能解决吗?

UPDATE3:艾伦·斯托克斯在下面的评论中建议了解决方案,这似乎对我有用:

您能否将 A 分成两个类 - 一个实现 B 所需的功能,另一个添加来自 std::exception 的继承?那么 A 和 B 都可以从(比如)A_base 继承。

谢谢您,如果有人有其他好的解决方案,请告诉我。

Mat*_* M. 4

Stroustrup建议从虚拟继承std::exception,这样只有一个转换路径。

就我个人而言,我发现制定多重继承方案可能是过度设计的,并且更喜欢线性继承链......或者根本没有。