TL; DR: Вы не должны наследовать от публично копируемого / подвижного класса.
На самом деле можно предотвратить нарезку объектов во время компиляции: базовый объектв этом контексте не должно быть копируемым.
Случай 1: абстрактная база
Если база абстрактная, ее нельзя создать, и, следовательно, вы не сможете испытать нарезку.
Случай 2: бетонная основа
Если основа не абстрактная, ее можно скопировать (по умолчанию).У вас есть два варианта:
- вообще запретить копирование
- разрешить копирование только для детей
Примечание: в C ++ 11 операции перемещения вызываюттот же вопрос.
// C++ 03, prevent copy
class Base {
public:
private:
Base(Base const&);
void operator=(Base const&);
};
// C++ 03, allow copy only for children
class Base {
public:
protected:
Base(Base const& other) { ... }
Base& operator=(Base const& other) { ...; return *this; }
};
// C++ 11, prevent copy & move
class Base {
public:
Base(Base&&) = delete;
Base(Base const&) = delete;
Base& operator=(Base) = delete;
};
// C++ 11, allow copy & move only for children
class Base {
public:
protected:
Base(Base&&) = default;
Base(Base const&) = default;
Base& operator=(Base) = default;
};