Вопрос проверяет понимание накладных расходов на абстракции в языках программирования, в частности, затрат на использование интерфейсов во время выполнения программы.
Интерфейс — это контракт, который определяет набор методов, которые должен реализовать класс. Он позволяет писать гибкий и расширяемый код, используя полиморфизм. Однако за эту гибкость приходится платить в рантайме.
class IShape {
public:
virtual void draw() = 0;
};
class Circle : public IShape {
public:
void draw() override { /* рисуем круг */ }
};
void render(IShape* shape) {
shape->draw(); // динамическая диспетчеризация
}В этом примере вызов shape->draw() не может быть оптимизирован, так как shape может указывать на любой класс, наследующий IShape.
В большинстве бизнес-приложений (веб-сервисы, GUI) накладные расходы на интерфейсы незаметны. Они становятся критичными в системах реального времени, игровых движках, высокочастотной торговле или научных вычислениях, где важна каждая микросекунда.
Использование интерфейсов оправдано, когда гибкость и расширяемость кода важнее микрооптимизаций. В высокопроизводительных участках стоит рассмотреть альтернативы: шаблоны (templates), статический полиморфизм (CRTP) или явное указание конкретных типов.