Ich habe den folgenden Code:
%Vor%Dieses Programm schlägt mit einem Segmentierungsfehler fehl. Es gibt zwei Lösungen, um dieses Programm zu arbeiten:
Beide sind jedoch keine Option. Ich gehe davon aus, dass dies wegen einer Suche in der vtable nicht funktioniert.
(Im realen Programm hat A auch virtuelle Funktionen. Auch die virtuelle Funktion wird im Konstruktor nicht aufgerufen.)
Gibt es eine Möglichkeit, dieses Programm zum Laufen zu bringen?
Das kannst du nicht machen, weil das Objekt, das du erstellst, A ist, nicht B. Deine Besetzung ist ungültig - ein Objekt von A (erstellt mit neuem) kann nicht magisch ein Objekt von B werden.
Meinst du A * a = neu A (), um tatsächlich A * a = neu B () zu sein? In diesem Fall würde ich erwarten, dass es funktioniert.
Sie können das nicht tun.
In Ihrem Beispiel ist a ein Objekt der Klasse A. Nicht B. Wenn Sie es in B umwandeln, wird es nicht zu einem B.
Wenn Sie polymorphe Objektverhalten verwenden möchten, können Sie der Klasse A die virtuelle Funktion f geben, und Sie können Code wie A* a = new B();
verwenden. Dann können Sie die virtuellen Funktionen über den a-Zeiger verwenden, um Verhalten aus Klasse B zu erhalten.
In Ihrem Code:
%Vor% Sie instanziieren ein Objekt A
. Dann versuchen Sie static_cast
zu verwenden, um von einem Basistyp zu einem abgeleiteten Typ zu wechseln:
Wenn der Wert in a
auf ein Objekt vom Typ B
verweisen würde, wäre dies legal und wohlgeformt. Aber a
zeigt nicht auf ein Objekt vom Typ B
, es zeigt auf ein A
, so dass der Cast ein undefiniertes Verhalten hervorruft.
Die Lösung besteht darin, zu ändern, wie Sie das Objekt instanziieren. Änderung:
%Vor%... zu:
%Vor%Tags und Links c++