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 |