MiddleДебаггингЧастоЕщё не отвечали
Что такое срезка объектов (object slicing) и как её предотвратить?
Circle хранит радиус, но после выполнения этого кода describe() печатает базовую фигуру, а радиус потерян.
#include <iostream>
#include <vector>
struct Shape {
virtual void describe() const { std::cout << "Shape\n"; }
};
struct Circle : Shape {
double r = 1.0;
void describe() const override { std::cout << "Circle r=" << r << "\n"; }
};
int main() {
std::vector<Shape> shapes;
shapes.push_back(Circle{}); // stored as Shape by value
shapes[0].describe(); // prints "Shape", radius lost
}
Найдите и исправьте ошибку.
Срезка происходит, когда производный объект копируется в базовый класс по значению — все производные члены теряются. Предотвращается ссылками, указателями, умными указателями или удалением конструктора копирования базового класса.
- ✗Хранение полиморфных объектов в std::vector<Base> по значению — каждый элемент обрезается при вставке
- ✗Передача объекта производного класса в функцию, принимающую Base по значению
- ✗Присваивание производного объекта переменной базового класса, не осознавая, что это компилируется молча
- →Почему std::vector<Base> вызывает срезку?
- →Как удаление конструктора копирования в абстрактном базовом классе предотвращает срезку?