Sobes.tech
Middle+

Как се нарича идиомата на статичния полиморфизъм в C++?

sobes.tech AI

Отговор от AI

Любопитно Повтарящ модел на шаблон (CRTP), известен също като статичен полиморфизъм или полиморфизъм по време на компилация.

Принципът CRTP се основава на това, че шаблонният клас Base използва като шаблонен параметър сам себе си, като по този начин е базов клас за някакъв производен клас Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Статично извикване на метода 'implementationMethod'
        // върху обект от тип Derived (който е T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Виртуална метода тук не е необходима
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Реализация, специфична за Derived
        // ...
    }
};

Предимства на CRTP пред динамичния полиморфизъм (с виртуални функции):

  • Производителност: Обажданията на функции са статични и се разрешават по време на компилация, избягвайки разходите за виртуална таблица.
  • Липса на разходи за виртуални функции: Няма нужда да се съхранява и използва vptr/vtbl.
  • По-строго типизиране: Грешки, свързани с несъответствие на типове или липса на реализация, се откриват по време на компилация.

Недостатъци:

  • Необходимост да се знае типът на потомка: Базовият клас трябва да бъде шаблонен и "знае" типа на производния клас.
  • Сложност за начинаещи: Моделът може да бъде по-малко интуитивен в сравнение с класическото наследяване с виртуални функции.
  • Невъзможност за работа с колекции от различни CRTP типове: Не може да се съхраняват в един контейнер обекти от различни производни CRTP класове и да се извикват чрез базов указател/връзка.

Сравнение с динамичния полиморфизъм:

Аспект CRTP (статичен полиморфизъм) Динамичен полиморфизъм (виртуални функции)
Разрешение на извикване Време на компилация Време на изпълнение
Производителност По-висока (без разходи за vtbl) По-ниска (с разходи за vtbl)
Разходи за ресурси Без vptr/vtbl Има vptr/vtbl
Гъвкавост (колекции) Не (не може да работи с различни типове чрез общ указател/връзка) Да (може да работи с различни типове)
Откриване на грешки Време на компилация Време на изпълнение
Сложност По-висока за начинаещи По-ниска за начинаещи