Sobes.tech
Middle+

Πώς ονομάζεται η ιδιωματική έκφραση του στατικού πολυμορφισμού σε C++;

sobes.tech AI

Απάντηση από AI

Περίεργα επαναλαμβανόμενο μοτίβο προτύπου (CRTP), επίσης γνωστό ως στατικό πολυμορφισμό ή πολυμορφισμό χρόνου μεταγλώττισης.

Η αρχή του CRTP βασίζεται στο γεγονός ότι η κλάση προτύπου Base χρησιμοποιεί τον εαυτό της ως παράμετρο προτύπου, ενώ ταυτόχρονα αποτελεί την βασική κλάση για μια παράγωγη κλάση Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Στατική κλήση της μεθόδου 'implementationMethod'
        // σε ένα αντικείμενο τύπου Derived (που είναι T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Δεν χρειάζεται εικονική μέθοδος εδώ
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Ειδική υλοποίηση για το Derived
        // ...
    }
};

Πλεονεκτήματα του CRTP έναντι του δυναμικού πολυμορφισμού (με εικονικές λειτουργίες):

  • Απόδοση: Οι κλήσεις συναρτήσεων είναι στατικές και επιλύονται κατά τη μεταγλώττιση, αποφεύγοντας το πρόσθετο κόστος του εικονικού πίνακα.
  • Χωρίς κόστος εικονικών λειτουργιών: Δεν χρειάζεται να αποθηκεύσετε ή να χρησιμοποιήσετε vptr/vtbl.
  • Πιο αυστηρός τύπος: Τα σφάλματα που σχετίζονται με ασυμβατότητες τύπων ή απουσία υλοποίησης ανιχνεύονται κατά τη μεταγλώττιση.

Μειονεκτήματα:

  • Ανάγκη να γνωρίζετε τον τύπο του απογόνου: Η βασική κλάση πρέπει να είναι πρότυπο και να "ξέρει" τον τύπο της παράγωγης κλάσης.
  • Πολυπλοκότητα για αρχάριους: Το μοτίβο μπορεί να είναι λιγότερο διαισθητικό σε σύγκριση με την κλασική κληρονομικότητα με εικονικές λειτουργίες.
  • Αδυναμία εργασίας με συλλογές διαφορετικών τύπων CRTP: Δεν μπορείτε να αποθηκεύσετε σε ένα κοντέινερ αντικείμενα διαφορετικών παράγωγων κλάσεων CRTP και να τα καλέσετε μέσω δείκτη/αναφοράς βάσης.

Σύγκριση με το δυναμικό πολυμορφισμό:

Πτυχή CRTP (στατικός πολυμορφισμός) Δυναμικός πολυμορφισμός (εικονικές λειτουργίες)
Επίλυση κλήσης Κατά τη μεταγλώττιση Κατά την εκτέλεση
Απόδοση Υψηλότερη (χωρίς κόστος vtbl) Χαμηλότερη (με κόστος vtbl)
Πρόσθετο κόστος Χωρίς vptr/vtbl Με vptr/vtbl
Ευελιξία (συλλογές) Όχι (δεν μπορεί να εργαστεί με διαφορετικούς τύπους μέσω κοινής δείκτη/αναφοράς βάσης) Ναι (μπορεί να εργαστεί με διαφορετικούς τύπους)
Εντοπισμός σφαλμάτων Κατά τη μεταγλώττιση Κατά την εκτέλεση
Πολυπλοκότητα Υψηλότερη για αρχάριους Χαμηλότερη για αρχάριους