Middle+
179
Jak nazywa się idiom statycznego polimorfizmu w C++?
Odpowiedź od AI
sobes.tech AI
Kuriozalnie powtarzający się wzorzec szablonu (CRTP), znany również jako statyczna polimorfizm lub polimorfizm w czasie kompilacji.
Zasada CRTP opiera się na tym, że klasa szablonowa Base używa siebie samej jako parametru szablonu, będąc jednocześnie klasą bazową dla klasy pochodnej Derived.
template <typename T>
class Base
{
public:
void interfaceMethod()
{
// Statyczne wywołanie metody 'implementationMethod'
// na obiekcie typu Derived (który jest T)
static_cast<T*>(this)->implementationMethod();
}
// Nie jest potrzebna tutaj metoda wirtualna
};
class Derived : public Base<Derived>
{
public:
void implementationMethod()
{
// Implementacja specyficzna dla Derived
// ...
}
};
Zalety CRTP w porównaniu do polimorfizmu dynamicznego (z funkcjami wirtualnymi):
- Wydajność: Wywołania funkcji są statyczne i rozwiązywane w czasie kompilacji, unikając narzutu związanego z tablicą wirtualną.
- Brak narzutu funkcji wirtualnych: Nie ma potrzeby przechowywania ani używania vptr/vtbl.
- Ścisłe typowanie: Błędy związane z niezgodnością typów lub brakiem implementacji są wykrywane na etapie kompilacji.
Wady:
- Konieczność znajomości typu klasy pochodnej: Klasa bazowa musi być szablonowa i "wiedzieć" o typie klasy pochodnej.
- Złożoność dla początkujących: Wzorzec może być mniej intuicyjny w porównaniu z klasycznym dziedziczeniem z funkcjami wirtualnymi.
- Niemożność pracy z kolekcjami różnych typów CRTP: Nie można przechowywać w jednym kontenerze obiektów różnych klas pochodnych CRTP i wywoływać ich przez wskaźnik lub referencję bazową.
Porównanie z polimorfizmem dynamicznym:
| Aspekt | CRTP (statyczny polimorfizm) | Polimorfizm dynamiczny (funkcje wirtualne) |
|---|---|---|
| Rozwiązanie wywołania | W czasie kompilacji | W czasie wykonania |
| Wydajność | Wyższa (brak narzutu vtbl) | Niższa (z narzutem vtbl) |
| Koszty dodatkowe | Brak vptr/vtbl | Z vptr/vtbl |
| Elastyczność (kolekcje) | Nie (nie można pracować z różnymi typami przez wspólny wskaźnik/bazę) | Tak (można pracować z różnymi typami) |
| Wykrywanie błędów | W czasie kompilacji | W czasie wykonania |
| Złożoność | Wyższa dla początkujących | Niższa dla początkujących |