Переопределенный метод C++, не будучи названным

10
задан dedObed 21 January 2019 в 14:36
поделиться

7 ответов

Вот ваша проблема:

struct ShapePointPair {
        Shape shape;
        Point location;
};

Вы сохраняете форму . Вы должны сохранить Shape * или shared_ptr или что-то в этом роде. Но не Shape ; C ++ не является Java.

Когда вы назначаете Rect фигуре , копируется только часть Shape (это нарезка объекта ).

24
ответ дан 3 December 2019 в 14:43
поделиться

Проблема в том, что в вашем векторе вы храните копии объектов Shape, а копирование объекта Shape не копирует данные или функциональные возможности его производных классов - вы разрезаете полиморфизм прочь.

Управляйте объектами с помощью команд new и delete, а также настройте свой вектор для хранения указателей на них.

2
ответ дан 3 December 2019 в 14:43
поделиться

Полиморфизм будет работать только от указателя на фигуру, не из объекта формы.

1
ответ дан 3 December 2019 в 14:43
поделиться

Эта проблема называется нарезкой - вы теряете производную функциональность при копировании в базу. Чтобы избежать этого, используйте указатели на базовый класс, то есть

std::vector<Graphics::Shape*> s;
s.push_back(&some_rect);
4
ответ дан 3 December 2019 в 14:43
поделиться

Вы обращаетесь к объекту формы напрямую, чтобы переопределение работало, вам необходимо получить доступ к объекту через указатель или ссылки.

Например, когда вы назначаете форму в ShapePointPair, код будет «нарезать» объект и скопировать только бит формы в ShapePointPair

. Это будет означать, что вам нужно будет следить за управлением памятью - чтобы вы могли использовать интеллектуальный указатель в структуре ShapePointPair { smart_pointer shape; Расположение точки; };

1
ответ дан 3 December 2019 в 14:43
поделиться

Нет, это не приведение.

Вместо этого вы можете сохранить ссылку на базовый класс Point:

struct ShapePointPair {
        Shape shape;
        Point &location;
};

Эта ссылка должна быть установлена ​​во время создания структуры ShapePointPair. Добавьте для этого конструктор в ShapePointPair цель. Необходимо передать (вновь созданные) экземпляры Rect.

Также обратите внимание на обязанности по управлению памятью (правильная письменные деструкторы и т. д.)

0
ответ дан 3 December 2019 в 14:43
поделиться

Вы можете попробовать boost :: ptr_vector

http: //www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html

0
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: