Sobes.tech
Middle+

Hoe heet de idiomatische uitdrukking voor statisch polymorfisme in C++?

sobes.tech AI

Antwoord van AI

Curieus terugkerend sjabloonpatroon (CRTP), ook bekend als statisch polymorfisme of compileertijd polymorfisme.

Het CRTP-principe is gebaseerd op het feit dat de sjabloonklasse Base zichzelf gebruikt als sjabloonparameter, terwijl het tegelijkertijd de basisklasse is voor een afgeleide klasse Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Statische aanroep van de methode 'implementationMethod'
        // op een object van type Derived (dat T is)
        static_cast<T*>(this)->implementationMethod();
    }

    // Hier is geen virtuele methode nodig
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Specifieke implementatie voor Derived
        // ...
    }
};

Voordelen van CRTP ten opzichte van dynamisch polymorfisme (met virtuele functies):

  • Prestaties: Functie-aanroepen zijn statisch en worden tijdens compilatie opgelost, waardoor overhead van virtuele tabellen wordt vermeden.
  • Geen overhead van virtuele functies: Het is niet nodig om vptr/vtbl op te slaan of te gebruiken.
  • Strengere typecontrole: Fouten gerelateerd aan type-incompatibiliteit of ontbrekende implementatie worden tijdens compilatie gedetecteerd.

Nadelen:

  • Noodzaak om het type van de afgeleide te kennen: De basisklasse moet een sjabloon zijn en het type van de afgeleide klasse "weten".
  • Complexiteit voor beginners: Het patroon kan minder intuïtief zijn in vergelijking met klassieke overerving met virtuele functies.
  • Onmogelijk om te werken met een collectie van verschillende CRTP-taken: Objecten van verschillende afgeleide CRTP-klassen kunnen niet in één container worden opgeslagen en via een basisaanduiding/-referentie worden aangeroepen.

Vergelijking met dynamisch polymorfisme:

Aspect CRTP (statisch polymorfisme) Dynamisch polymorfisme (virtuele functies)
Aanroepresolutie Tijdens compilatie Tijdens uitvoering
Prestaties Hoger (geen overhead vtbl) Lager (met overhead vtbl)
Extra kosten Geen vptr/vtbl Met vptr/vtbl
Flexibiliteit (collecties) Nee (kan niet werken met heterogene typen via een gemeenschappelijke basisaanduiding/-referentie) Ja (kan werken met heterogene typen)
Foutdetectie Tijdens compilatie Tijdens uitvoering
Complexiteit Hoger voor beginners Lager voor beginners