Ich habe ein wenig Probleme mit Microsoft Visual C ++ 2015 und konnte das Problem mit einem kleinen Programm replizieren. Gegeben die folgenden Klassen:
%Vor%Ich erhalte einen "reinen virtuellen Funktionsaufruf" -Fehler, wenn ich folgendes mache:
%Vor% Da ich die Funktion void use(const BaseClass&)
nicht ändern kann, kann ich irgendetwas in der Klasse Impersonator
ändern, um die Verwendung des letzten Aufrufs zuzulassen, ohne einen Debug-Fehler zu generieren?
Die einzige Möglichkeit, das Problem, das ich sehe, abzuschwächen ist, ein operator const BaseClass&()
zu Impersonator
hinzuzufügen und es einen Verweis auf DerivedClass
zurückgeben zu lassen.
Dies erzeugt eine bessere Umwandlung als die problematische / fehlerhafte, die der Compiler zu verwenden versucht.
Natürlich kann Impersonator
nicht nach Wert zurückgeben und ein temporäres Objekt erstellen, also muss es ein DerivedClass
-Objekt oder viele Objekte besitzen und sie irgendwie zu einem geeigneten Zeitpunkt beseitigen. Der einfachste Weg, der für dieses Demo-Programm funktioniert, ist, dass es einen Verweis auf seinen Daten-Member zurückgibt, aber ein echtes Programm möglicherweise etwas anderes tun muss.
Dies ist eine Problemumgehung. Erstellen Sie einen Wrapper für use
, der eine const DerivedClass&
akzeptiert.
Die bessere Übereinstimmung bedeutet, dass der Workaround-Wrapper ausgewählt wird. Daher wird ein temporärer Typ mit dem korrekten Typ erstellt und ein Verweis auf den read use
-Implementierung.
Tags und Links c++ c++11 visual-studio-2015 base-class pure-virtual