Shape.h
%Vor%Rect.h
%Vor%Verwendet wie folgt:
%Vor%Dieser Code ruft Shape :: Render und nicht Rect :: Render
aufIch 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?
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 ).
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%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.
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
kopierenDas bedeutet, dass Sie die Speicherverwaltung überwachen müssen - damit Sie einen intelligenten Zeiger in der Struktur verwenden können ShapePointPaar { smart_pointer Form; Punktort; };
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.).
Tags und Links c++ inheritance virtual override