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.