Sobes.tech
Middle+
180

Cum se numește idiomul polimorfismului static în C++?

Răspuns de la AI

sobes.tech AI

Modelul de șablon recurent curios (CRTP), cunoscut și sub numele de polimorfism static sau polimorfism în timpul compilării.

Principiul CRTP se bazează pe faptul că clasa șablon Base folosește ca parametru de șablon chiar ea însăși, fiind în același timp clasa de bază pentru o clasă derivată Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Apel static la metoda 'implementationMethod'
        // pe un obiect de tip Derived (care este T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Nu este nevoie de o metodă virtuală aici
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Implementare specifică pentru Derived
        // ...
    }
};

Avantajele CRTP față de polimorfismul dinamic (cu funcții virtuale):

  • Performanță: Apelurile de funcții sunt statice și rezolvate în timpul compilării, evitând costurile suplimentare ale tabelei virtuale.
  • Fără costuri suplimentare pentru funcțiile virtuale: Nu este necesar să stocați sau să folosiți vptr/vtbl.
  • Tipizare mai strictă: Erorile legate de incompatibilitatea tipurilor sau lipsa implementării sunt detectate în timpul compilării.

Dezavantaje:

  • Necesitatea de a cunoaște tipul clasei derivate: Clasa de bază trebuie să fie șablon și să "știe" tipul clasei derivate.
  • Complexitate pentru începători: Pattern-ul poate fi mai puțin intuitiv comparativ cu moștenirea clasică cu funcții virtuale.
  • Imposibilitatea de a lucra cu colecții de diferite tipuri CRTP: Nu se pot stoca în același container obiecte ale diferitelor clase derivate CRTP și să le apelăm printr-un pointer/referință de bază.

Comparativ cu polimorfismul dinamic:

Aspect CRTP (polimorfism static) Polimorfism dinamic (funcții virtuale)
Rezolvare apel În timpul compilării În timpul execuției
Performanță Mai mare (fără costuri vtbl) Mai mică (cu costuri vtbl)
Costuri suplimentare Fără vptr/vtbl Cu vptr/vtbl
Flexibilitate (colecții) Nu (nu se poate lucra cu tipuri heterogene printr-un pointer/referință de bază comună) Da (se poate lucra cu tipuri heterogene)
Detectarea erorilor În timpul compilării În timpul execuției
Complexitate Mai mare pentru începători Mai mică pentru începători