Ausnahme Mehrfachvererbung

Ich habe das Problem mit dem Mischen von Ausnahmen und Mehrfachvererbung. Grundsätzlich habe ich diesen Code:

#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;
    }
}

Was ich brauche, ist es zu ändern, so dass Ausnahme der Klasse B als std :: exception abgefangen werden kann (für den Moment heißt der Terminate-Handler). Wie kann ich ein solches Verhalten erreichen? Ich vermute, dass eine virtuelle Vererbung erforderlich ist, sehe aber keine Möglichkeit, sie in diesem Fall zu verwenden.

UPDATE: Ich muss in der Lage sein:
- fange A als A (trivial),
- fange A als std :: exception,
- fange B als B (wieder trivial),
- fange B als std :: exception,
- fange B als std :: runtime_error

Ich weiß, dass dies eine Menge Anforderungen sind, und vielleicht macht es nicht viel Sinn, aber ich brauche es und bin nur neugierig :)

UPDATE2: Ich denke, das Problem ist std :: runtime_error, das sich nicht virtuell von std :: exception ableitet (was es mir ermöglichen würde, das Problem durch virtuelle Vererbung in A zu lösen). Habe ich recht? Kann es trotzdem gelöst werden?

UPDATE3: Alan Stokes schlug in den Kommentaren unten eine Lösung vor, die für mich zu funktionieren scheint:

Können Sie A in zwei Klassen aufteilen - eine, die die von B benötigte Funktionalität implementiert, und eine, die die Vererbung von std :: exception hinzufügt? Dann könnten sowohl A als auch B von (sagen wir) A_base erben.

Vielen Dank, falls jemand andere gute Lösungen hat, lassen Sie es mich bitte wissen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage