Sobes.tech
Middle+

C++та статикалык полиморфизм идиомасы кандай аталат?

sobes.tech AI

AIден жооп

Кызыктуу кайталанган шаблон үлгүсү (CRTP), ошондой эле статикалык полиморфизм же компиляция учурунда полиморфизм деп аталат.

CRTP принциби Base шаблон классы өзүңүздү шаблон параметри катары колдонуп, ошол эле учурда Derived деген өнөкөт класстын негизги классы болуп саналат.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Статикалык түрдө 'implementationMethod' методун чакыруу
        // T типиндеги объектте (которо T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Виртуалдуу метод керек эмес
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Derived үчүн өзгөчө ишке ашыруу
        // ...
    }
};

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

  • Өндүрүмдүүлүк: Функция чакыруулары статикалык жана компиляция учурунда чечилет, виртуалдык таблицанын чыгымдарын жоготпостон.
  • Виртуалдуу функциялардын чыгымдары жок: vptr/vtbl сакталбайт жана колдонулбайт.
  • Катуу типтөө: Туура келбеген типтер же ишке ашырбоо каталары компиляция учурунда аныкталат.

Кемчиликтери:

  • Туура келген типти билүү керек: Base классы шаблондуу болушу керек жана өнөкөт класстын типин "билүү" керек.
  • Жаңы баштагандар үчүн кыйынчылык: Бул үлгү классикалык мурас менен салыштырганда түшүнүү кыйын болушу мүмкүн.
  • CRTP түрлөрүнүн коллекциясы менен иштөө мүмкүн эмес: Бир контейнерде ар кандай өнөкөт CRTP класстарынын объекттерин сактоо жана алардын методдорун негизги көрсөткүч же шилтеме аркылуу чакыруу мүмкүн эмес.

Динамикалык полиморфизм менен салыштыруу:

Аспект CRTP (статикалык полиморфизм) Динамикалык полиморфизм (виртуалдуу функциялар)
Чакырууну чечүү Компиляция учурунда Ишке ашыруучу убакта
Өндүрүмдүүлүк Жогору (vtbl чыгымдары жок) Төмөн (vtbl чыгымдары бар)
Ресурстардын чыгымдары vptr/vtbl жок Бар vptr/vtbl
Ишке ашыруунун ийкемдүүлүгү Жок (жалпы негизги көрсөткүч/шилтеме аркылуу ар кандай түрлөр менен иштөө мүмкүн эмес) Ооба (ар кандай түрлөр менен иштөө мүмкүн)
Каталардын аныкталышы Компиляция учурунда Ишке ашыруучу убакта
Кыйынчылык Жаңы баштагандар үчүн жогору Жаңы баштагандар үчүн төмөнү