Polymorphism statico spiegato

-2

Ecco un codice che ho ricevuto da qui :

class Deletor {
    public:  virtual ~Deletor() {}
};

template<typename T> class Base : public Deletor {
    public: 

        int  Run() { return static_cast<T*>(this)->DoIt(); }
};

class Derived1 : public Base<Derived1> {
    ...
    public:
        int  DoIt() { /* the actual implementation for Derived1 */  }
};

class Derived2 : public Base<Derived2> {
    ...
    public:
        int  DoIt() { /* the actual implementation for Derived2 */  }
};

int main() {
    Derived1 Obj1;
    Derived2 Obj2;

    Obj1.Run(); /* runs the actual DoIt() implementation */
    Obj2.Run(); /* runs the actual DoIt() implementation */
};

Sembro e questo codice e penso perché ho dovuto usare l'ereditarietà o il CRTP per raggiungere questo obiettivo? Potrei semplicemente scrivere due classi non correlate che implementano entrambi il metodo Run() . Cosa mi manca qui?

    
posta Narek 07.04.2016 - 16:37
fonte

1 risposta

1

Diventa interessante quando Run fa altre cose oltre a chiamare DoIt e DoIt è solo un punto di personalizzazione. Quindi, in sostanza, Run è un'operazione complicata, con piccole variazioni. Queste variazioni sono raggiunte da varie funzioni DoIt nelle diverse sottoclassi, mentre la maggior parte del codice è condivisa.

Ad esempio, la classe base potrebbe essere un aiuto per implementare puntatori intelligenti. Ciò richiede un bel po 'di codice boilerplate (gli operatori di conversione *, - & gt ;,!, ==,! =, E bool), che in realtà si riducono alla sola domanda "dammi un puntatore crudo", di solito chiamata %codice%. È possibile condividere tutto questo boilerplate in una base CRTP e implementare solo get() nelle classi derivate.

    
risposta data 07.04.2016 - 16:46
fonte

Leggi altre domande sui tag