Исключение множественного наследования

У меня проблема со смешиванием исключений и множественным наследованием. В основном у меня есть этот код:

#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 как std :: исключение,
- поймать B как B (опять же, тривиально),
- поймать B как std :: исключение,
- поймать B как std :: runtime_error

Я знаю, что это много требований, и, возможно, это не имеет особого смысла, но мне это нужно, и мне просто любопытно :)

ОБНОВЛЕНИЕ 2: Я думаю, что проблема в том, что std :: runtime_error фактически не выводит из std :: exception (что позволило бы мне решить проблему путем виртуального наследования в A). Я прав? Тем не менее, это может быть решено?

ОБНОВЛЕНИЕ 3: Алан Стоукс предложил решение в комментариях ниже, которое, кажется, работает для меня:

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.

Спасибо за это, все же, если у кого-то есть другие хорошие решения, пожалуйста, дайте мне знать.

Ответы на вопрос(1)

Ваш ответ на вопрос