Вот ваша проблема:
struct ShapePointPair {
Shape shape;
Point location;
};
Вы сохраняете форму
. Вы должны сохранить Shape *
или shared_ptr
или что-то в этом роде. Но не Shape
; C ++ не является Java.
Когда вы назначаете Rect
фигуре
, копируется только часть Shape
(это нарезка объекта ).
Проблема в том, что в вашем векторе вы храните копии объектов Shape, а копирование объекта Shape не копирует данные или функциональные возможности его производных классов - вы разрезаете полиморфизм прочь.
Управляйте объектами с помощью команд new и delete, а также настройте свой вектор для хранения указателей на них.
Полиморфизм будет работать только от указателя на фигуру, не из объекта формы.
Эта проблема называется нарезкой - вы теряете производную функциональность при копировании в базу. Чтобы избежать этого, используйте указатели на базовый класс, то есть
std::vector<Graphics::Shape*> s;
s.push_back(&some_rect);
Вы обращаетесь к объекту формы напрямую, чтобы переопределение работало, вам необходимо получить доступ к объекту через указатель или ссылки.
Например, когда вы назначаете форму в ShapePointPair, код будет «нарезать» объект и скопировать только бит формы в ShapePointPair
. Это будет означать, что вам нужно будет следить за управлением памятью - чтобы вы могли использовать интеллектуальный указатель в структуре ShapePointPair { smart_pointer shape; Расположение точки; };
Нет, это не приведение.
Вместо этого вы можете сохранить ссылку на базовый класс Point:
struct ShapePointPair {
Shape shape;
Point &location;
};
Эта ссылка должна быть установлена во время создания структуры ShapePointPair. Добавьте для этого конструктор в ShapePointPair цель. Необходимо передать (вновь созданные) экземпляры Rect.
Также обратите внимание на обязанности по управлению памятью (правильная письменные деструкторы и т. д.)
Вы можете попробовать boost :: ptr_vector
http: //www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html