Как запретить наследование от класса в C++

«Как запретить наследование от класса в C++» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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.