c++ - 异常多重继承

标签 c++ inheritance exception-handling 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;
    }
}

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

更新:我需要能够:
- 把 A 当作 A(平凡的),
- 将 A 捕获为 std::exception,
- 将 B 当作 B 捕获(同样,微不足道),
- 将 B 捕获为 std::exception,
- 将 B 捕获为 std::runtime_error

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

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

更新 3:Alan Stokes 在下面的评论中提出了解决方案,这似乎对我有用:

Can you split A into two classes - one that implements the functionality B needs, and one that adds in the inheritance from std::exception? Then both A and B could inherit from (say) A_base.

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

最佳答案

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

就我个人而言,我发现制定多重继承方案可能是过度工程化,我更喜欢线性继承链……或者根本没有。

关于c++ - 异常多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484691/

相关文章:

c++ - 在 catch-all 回调中识别来自 QDBusPendingCallWatcher 的原始调用

c++ - 偶尔的段错误

c++ - 用非零值初始化 void 指针的正确(或最安全)方法?

grails - GORM 抽象域类

haskell - 为什么捕获异常是非纯的,而抛出异常是纯的?

c++ - 在链表末尾插入节点时出错

Java泛型结合接口(interface)继承

java - 第三方类扩展难

JavaFX 2 - 捕获所有运行时异常

c# - 如何让这个异常处理代码遵守DRY原则?