C ++ Überschriebene Methode wird nicht aufgerufen

8

Shape.h

%Vor%

Rect.h

%Vor%

Verwendet wie folgt:

%Vor%

Dieser Code ruft Shape :: Render und nicht Rect :: Render

auf

Ich gehe davon aus, dass dies darauf zurückzuführen ist, dass es das Rect in eine Form verwandelt, aber ich habe keine Ahnung, wie ich damit aufhören könnte. Ich versuche, durch Überschreiben der Render-Methode für jede Form festzulegen, wie sie gerendert wird.

Irgendwelche Ideen, wie Sie das erreichen können?

    
Simon Moles 18.09.2009, 11:41
quelle

7 Antworten

19

Hier ist dein Problem:

%Vor%

Sie speichern ein Shape . Sie sollten ein Shape * oder ein shared_ptr<Shape> oder etwas speichern. Aber kein Shape ; C ++ ist nicht Java.

Wenn Sie der Rect eine Shape zuweisen, wird nur die Shape Komponente kopiert (das ist Objekt-Slicing ).

    
dave4420 18.09.2009, 11:49
quelle
3

Dieses Problem wird Slicing genannt - Sie verlieren die abgeleitete Funktionalität beim Kopieren in eine Basis. Um dies zu vermeiden, verwenden Sie Zeiger auf die Basisklasse, d. H.

%Vor%     
Georg Fritzsche 18.09.2009 11:49
quelle
2

Das Problem besteht darin, dass Sie in Ihrem Vektor Kopien von Shape-Objekten speichern und das Kopieren eines Shape-Objekts nicht die Daten oder Funktionen seiner abgeleiteten Klassen kopiert - Sie sind schneiden den Polymorphismus weg.

Verwalten Sie die Objekte mithilfe von new und delete, und sorgen Sie dafür, dass Ihr Vektor Zeiger darauf speichert.

    
moonshadow 18.09.2009 11:49
quelle
1

Der Polymorphismus funktioniert nur von einem Zeiger zu einer Form, nicht von einem Formobjekt.

    
Locksfree 18.09.2009 11:47
quelle
1

Sie greifen direkt auf das Shape-Objekt zu, damit die Überschreibung funktioniert. Sie müssen auf das Objekt über einen Zeiger oder Referenzen zugreifen.

Wenn Sie zum Beispiel die Form in ShapePointPair zuweisen, wird der Code das Objekt "schneiden" und nur das Shape-Bit in die ShapePointPair

kopieren

Das bedeutet, dass Sie die Speicherverwaltung überwachen müssen - damit Sie einen intelligenten Zeiger in der Struktur verwenden können     ShapePointPaar {            smart_pointer Form;             Punktort;     };

    
Mark 18.09.2009 11:53
quelle
0

Nein, es wird nicht geworfen.

Sie können stattdessen einen Verweis auf Basisklasse Point speichern:

%Vor%

Dieser Verweis muss zur Konstruktionszeit für struct gesetzt werden ShapePointPair. Fügen Sie ShapePointPair hierfür einen Konstruktor hinzu Zweck. Es müssen (neu erstellte) Instanzen von Rect.

Beachten Sie auch die Speicherverwaltungsfunktionen (ordnungsgemäß geschriebene Destruktoren, etc.).

    
Peter Mortensen 18.09.2009 11:55
quelle
0

Sie könnten boost :: ptr_vector

ausprobieren

Ссылка

    
Chris Bednarski 18.09.2009 15:01
quelle

Tags und Links