Ответ
В C++ есть два основных способа запретить наследование от класса.
1. Использование ключевого слова final (C++11 и новее)
Это самый простой и рекомендуемый современный способ. Ключевое слово final указывается после имени класса.
class Base final { // Класс помечен как final
// ... содержимое класса ...
};
class Derived : public Base { // Ошибка компиляции: cannot derive from 'final' base
};
2. Использование приватного конструктора и friend-класса (до C++11)
Этот метод работает в любом стандарте, но сложнее. Конструктор делается приватным, а для создания экземпляров используется статический метод или friend-класс.
class NonInheritable {
private:
NonInheritable() {} // Приватный конструктор
public:
// Фабричный метод для создания экземпляров
static NonInheritable createInstance() {
return NonInheritable();
}
};
class Derived : public NonInheritable { // Ошибка: 'NonInheritable::NonInheritable()' is private
};
int main() {
auto obj = NonInheritable::createInstance(); // OK
// NonInheritable obj2; // Ошибка: конструктор приватный
}
Вывод: Для новых проектов используйте final. Старый метод с приватным конструктором полезен для поддержки legacy-кода или создания паттерна типа Singleton.