Pubblico rispetto all'ereditarietà privata quando alcuni dei metodi dei genitori devono essere esposti?

2

L'ereditarietà pubblica significa che tutti i campi della classe base mantengono la visibilità dichiarata, mentre i privati significano che sono obbligati a "privato" nell'ambito della classe derivata.

Cosa si dovrebbe fare se alcuni membri del genitore (ad esempio, metodi) devono essere esposti pubblicamente?

Posso pensare a due soluzioni. L'eredità pubblica in qualche modo rompe l'incapsulamento. Inoltre, quando è necessario scoprire dove è definito il metodo foo (), è necessario esaminare una catena di classi base.

L'ereditarietà privata risolve questi problemi, ma introduce l'onere di scrivere i wrapper (più testo). Quale potrebbe essere una buona cosa nella linea di verbosità, ma rende i cambiamenti delle interfacce incredibilmente ingombranti.

Quali considerazioni mi mancano? Quali sono i vincoli sul tipo di progetto? Come scegliere tra i due (non sto nemmeno citando "protetto")?

Nota che sto prendendo di mira metodi non virtuali. Non c'è una tale discussione per i metodi virtuali (o c'è).

    
posta Vorac 13.06.2014 - 15:36
fonte

1 risposta

3

Puoi esporre elementi che altrimenti avrebbero qualche tipo di accesso limitato (cioè privato o protetto) senza scrivere una funzione wrapper utilizzando using direttiva :

class base {
public:
    base();
    virtual ~base();
    void do_something();
    void do_something_else();
private:
    // elided
};

class derived : private base {
public:
    derived();
    virtual ~derived();
    using base::do_something();
};

In quanto sopra, la classe derivata espone base::do_something() come metodo pubblico, ma non base::do_something_else() .

    
risposta data 13.06.2014 - 16:31
fonte

Leggi altre domande sui tag