2012-09-02 19 views
6

Eventuali duplicati:
Private virtual method in C++C++: funzioni virtuali private vs. funzioni virtuali puri

Se ho capito bene da questo post (Private virtual method in C++), facendo una funzione virtuale in una classe base rende le classi derivate in grado di sovrascriverlo. Ma sembra che le cose si fermino qui.

Ma se la funzione virtuale della classe base è pura, forza le classi derivate a implementare la funzione. Quindi, una pura funzione virtuale (pubblica) è semplicemente un'interfaccia. Posso vedere un beneficio qui.

D'altra parte, rendendo privata una funzione virtuale di classe di base, fornisce alla classe derivata solo la possibilità di eseguire l'override della funzione, ma non vedo alcun vantaggio. È come se quella funzione privata privata non fosse nemmeno lì. La classe derivata ovviamente non conosce l'esistenza di quella funzione virtuale nella classe base perché è privata, quindi c'è qualche vantaggio nel dichiarare una funzione privata di classe base virtuale, in termini di ereditarietà o polimorfismo?

Inoltre, c'è qualche situazione in cui una classe di base dichiarerebbe una funzione "virtuale pura" e "privata"?

Grazie.

risposta

12

Un beneficio è nell'attuazione del template method pattern:

class Base { 

public : 
    void doSomething() { 
    doSomething1(); 
    doSomething2(); 
    doSomething3(); 
    } 
private: 
    virtual void doSomething1()=0; 
    virtual void doSomething2()=0; 
    virtual void doSomething3()=0; 
}; 


class Derived : public Base { 
    private: 
    virtual void doSomething1() { ... } 
    virtual void doSomething2() { .... } 
    virtual void doSomething3() { .... } 
} 

Questo consente alle classi derivate di implementare ogni pezzo di una certa logica, mentre la classe base determina come mettere insieme questi pezzi. E poiché i pezzi non hanno senso da soli, sono dichiarati private e così nascosti dal codice cliente.

0

Se il metodo è virtuale, può essere sovrascritto dalle classi derivate, anche se privato. Ad ogni modo, dovrebbe essere dichiarato con protetto.

+2

Perché dichiararlo protetto se si sa che non sarà necessario accedere al metodo di base dalle classi derivate? Puoi ignorare qualcosa senza doverlo chiamare. –

+0

http://www.parashift.com/c++-faq-lite/private-virtuals.html – Samson

+0

Nessun motivo * deve * essere dichiarato "protetto". Se hai bisogno di 'protected', usalo. In caso contrario, utilizzare 'private'. – juanchopanza

3

È per le situazioni che la base vuole che i suoi figli implementino funzionalità che la base stessa deve utilizzare. Immagina un esempio stupido: le auto.

class Car { 
public: 
    int getTorque(); 
    int getPower(); 

private: 
    virtual const Engine& gimmeEngine() = 0; 
}; 

class Ferrari : public Car { 
private: 
    FerrariEngine myCoolEngine; 
    const Engine& gimmeEngine() { return myCoolEngine; } 
}; 

Ora auto non ha bisogno di sapere nulla di motore della Ferrari, solo che implementa alcune Engine interfaccia che garantisce che Car possibile ottenere le informazioni sulla sua potenza e coppia.

In questo stupido esempio tutto potrebbe essere semplificato rendendo getTorque e getPower virtuale puro, ma spero che illustri l'idea. Base ha bisogno di usare una logica specifica. conosce ogni bambino deve avere, quindi lo interroga attraverso un membro virtuale puro privato.

Problemi correlati