Как разрешить использование только конкретного наследуемого от интерфейса, не финального класса?

В C++ можно разрешить использование только конкретного наследуемого от интерфейса, не финального класса, с помощью механизма виртуального наследования.

Для начала, нужно создать интерфейс с помощью класса, объявляя его методы как чисто виртуальные функции. Например:

class IInterface {
public:
    virtual void doSomething() = 0;
};

Затем, создайте абстрактный базовый класс, который будет включать в себя интерфейс, но без реализации методов. Этот класс также должен быть объявлен как абстрактный, чтобы запретить его использование напрямую:

class BaseClass : public virtual IInterface {
public:
    // Методы интерфейса
    virtual void doSomething() = 0;
};

Далее можно создавать конкретные классы, наследующие от базового абстрактного класса. В этих классах необходимо реализовать методы интерфейса:

class ConcreteClass : public BaseClass {
public:
    // Реализация методов интерфейса
    void doSomething() override {
        // Код, выполняющий действия, специфичные для этого класса
    }
};

Теперь вы можете создавать объекты только конкретного класса, наследуемого от интерфейса, с помощью указателей или ссылок на базовый класс:

BaseClass* obj = new ConcreteClass();
obj->doSomething(); // Вызов метода интерфейса
delete obj; // Освобождение памяти

Таким образом, вы можете ограничить использование только конкретного наследуемого от интерфейса, не финального класса, благодаря виртуальному наследованию и использованию абстрактного базового класса.