Ich verstehe die Notwendigkeit der virtuellen Vererbung bei der Verwendung der Mehrfachvererbung - es löst das gefürchtete Diamantproblem.
Aber was, wenn ich nicht mehrfache Vererbung verwende? Benötigen Sie überhaupt eine virtuelle Vererbung?
Ich erinnere mich zu hören, dass es für Ausnahmen wichtig war (eine abgeleitete Klasse werfen, nach Basisklassenreferenz fangen). Aber sollten nicht virtuelle Destruktoren dafür ausreichen?
Ich habe versucht, nach der Referenzseite zu suchen, die ich einmal gesehen habe, aber ich kann sie nicht finden.
Sie denken wahrscheinlich über diese Boost.Exception-Richtlinie nach , die ich hier der Vollständigkeit halber kopieren werde:
Ausnahmetypen sollten die virtuelle Vererbung verwenden, wenn sie von anderen Ausnahmetypen abgeleitet werden. Diese Einsicht ist Andrew Koenig zu verdanken. Die Verwendung der virtuellen Vererbung verhindert Mehrdeutigkeitsprobleme im Ausnahmebehandler:
%Vor%Das obige Programm gibt "hoppla!" aus. weil die Konvertierung in std :: exception mehrdeutig ist.
Der Overhead, der durch die virtuelle Vererbung eingeführt wird, ist im Kontext der Ausnahmebehandlung immer vernachlässigbar. Beachten Sie, dass virtuelle Basen direkt vom Konstruktor des am meisten abgeleiteten Typs initialisiert werden (der Typ, der im Falle von Ausnahmen an die throw-Anweisung übergeben wird.) Dieses Detail spielt jedoch normalerweise keine Rolle, wenn boost :: exception wird verwendet, weil es Exception-Typen erlaubt, triviale Strukturen ohne Mitglieder zu sein (es gibt nichts zu initialisieren.) Siehe Ausnahmetypen als einfache semantische Tags .
Nein, es wird nicht benötigt, außer um das Diamantproblem zu lösen. Sie müssen sich Dinge vorstellen!
Die einzige Kosten der virtuellen Vererbung ist die vtable, die nicht viel kostet. Die Verwendung von virtueller Vererbung bedeutet, dass später, nachdem die Leute von verschiedenen Dingen erben, das Doppel-Diamant-Problem ihren hässlichen Kopf nicht unerwartet aufrichten wird. Es bedeutet nur, dass Ihre Klasse eine gute Basisklasse bildet.
Ich verstehe die Notwendigkeit der virtuellen Vererbung bei der Verwendung der Mehrfachvererbung - es löst das gefürchtete Diamantproblem.
Aber was, wenn ich nicht mehrfache Vererbung verwende?
Frage (meistens rhetorisch): Woher willst du wissen, dass MI nie benutzt wird?
Antwort: Das können Sie nicht wissen. (Bis Sie es beweisen.)
Ich erinnere mich zu hören, dass es für Ausnahmen wichtig war (eine abgeleitete Klasse werfen, nach Basisklassenreferenz fangen). Aber sollten nicht virtuelle Destruktoren dafür ausreichen?
Frage (rhetorisch): Warum sollte hier ein virtueller Destruktor notwendig sein?
Antwort: Es ist nicht.
Tags und Links c++ exception-handling virtual-inheritance