C++ переопределенный метод не вызывается
формы.h
namespace Graphics {
class Shape {
public:
virtual void Render(Point point) {};
};
}
Вильный.h
namespace Graphics {
class Rect : public Shape {
public:
Rect(float x, float y);
Rect();
void setSize(float x, float y);
virtual void Render(Point point);
private:
float sizeX;
float sizeY;
};
}
struct ShapePointPair {
Shape shape;
Point location;
};
использовать так:
std::vector<Graphics::ShapePointPair> theShapes = theSurface.getList();
for(int i = 0; i < theShapes.size(); i++) {
theShapes[i].shape.Render(theShapes[i].location);
}
этот код заканчивается вызовом Shape::Render, а не Rect:: Render
Я предполагаю, что это потому, что он бросает прямую кишку в форму, но я понятия не имею, как остановить это. Я пытаюсь позволить каждой форме управлять тем, как она отображается, переопределяя метод Render.
есть идеи о том, как этого достичь?
7 ответов
вот ваша проблема:
struct ShapePointPair {
Shape shape;
Point location;
};
хранятся Shape
. Вы должны хранить Shape *
или shared_ptr<Shape>
или что-то в этом роде. Но не Shape
; C++ не является Java.
при назначении Rect
до Shape
, только Shape
часть копируется (это объект нарезки).
эта проблема называется нарезкой-вы теряете производную функциональность при копировании в базу. Чтобы избежать этого, используйте указатели на базовый класс, т. е.
std::vector<Graphics::Shape*> s;
s.push_back(&some_rect);
проблема в том, что в вашем векторе вы храните копии объектов Shape, а копирование объекта Shape не копирует данные или функциональность его производных классов - вы для нарезки полиморфизм подальше.
управление объектами с помощью new и delete, а также организовать для вашего вектора для хранения указателей на них.
вы обращаетесь к объекту shape непосредственно для переопределения для работы вам нужно получить доступ к объекту с помощью указателя или ссылок.
например, когда вы назначаете фигуру в ShapePointPair, код будет "нарезать" объект и только скопировать бит фигуры в ShapePointPair
Это означает, что вам нужно следить за управлением памятью-чтобы вы могли использовать умный указатель в структуре ShapePointPair { форма smart_pointer; Точка местоположение; };
нет, это не кастинг.
вместо этого вы можете сохранить ссылку на точку baseclass:
struct ShapePointPair {
Shape shape;
Point &location;
};
эта ссылка должна быть установлена во время построения struct ShapePointPair. Добавьте конструктор в ShapePointPair для этого цель. Необходимо передать (вновь созданные) экземпляры Прямоугольник.
также соблюдайте функции управления памятью (proper письменные деструкторы и т. д.).
вы можете попробовать boost:: ptr_vector
http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html