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