MediumООПUB
Что такое object slicing?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Object slicing — объект производного класса копируется в объект базового по значению (не через указатель/ссылку): копируется только Base-часть, производные члены и vptr теряются.
struct Base { virtual void f() { std::cout << "B"; } };
struct Derived : Base { void f() override { std::cout << "D"; } };
Derived d;
Base b = d; // SLICING: копируется только Base-часть, vptr теряется
b.f(); // выводит "B", а не "D"
// ХОРОШО: указатель/ссылка сохраняют vptr
Base& r = d;
r.f(); // выводит "D"- Случается при передаче по значению, возврате по значению, помещении в
vector<Base>; - Решение: использовать указатель или ссылку на базовый класс;
vector<Base>с Derived — disaster; используйтеvector<unique_ptr<Base>>.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.