C ++: unerklärlicher "reiner virtueller Funktionsaufruf" -Fehler

9

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?

    
Paul Houx 01.08.2016, 16:49
quelle

2 Antworten

2

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.

%Vor%     
n.m. 01.08.2016 20:08
quelle
1

Dies ist eine Problemumgehung. Erstellen Sie einen Wrapper für use , der eine const DerivedClass& akzeptiert.

%Vor%

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.

    
Ben 01.08.2016 21:40
quelle