Verwendung der virtuellen Funktion in Kind nach der Casting-Operation in C ++

7

Ich habe den folgenden Code:

%Vor%

Dieses Programm schlägt mit einem Segmentierungsfehler fehl. Es gibt zwei Lösungen, um dieses Programm zu arbeiten:

  1. deklariere f nicht virtuell
  2. rufe nicht b- & gt; f () auf (d. h. es schlägt nicht wegen der Besetzung fehl)

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?

    
Alexander 09.02.2010, 16:10
quelle

4 Antworten

12

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.

    
Joe 09.02.2010, 16:13
quelle
3

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.

    
Zan Lynx 09.02.2010 16:14
quelle
3

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:

%Vor%

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%     
John Dibling 09.02.2010 16:29
quelle
2

Um ein static_cast zu machen, sollten Sie sicher sein, dass das Objekt cassed sein kann, d. h. ein Objekt der Klasse B ist.

In diesem Fall bin ich sicher, dass nicht ist.

    
xtofl 09.02.2010 16:13
quelle

Tags und Links