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 подскажет развёрнутый ответ в реальном времени.