In primo luogo, devi capire cosa vuoi fare dalla prospettiva OOP. Esistono due tipi di ereditarietà completamente diversi:
Ereditarietà dell'interfaccia. È quando si esegue implement
in Java o in altri linguaggi che hanno interfacce come entità indipendenti, ma si verifica anche quando si eredita pubblicamente da una classe astratta vuota in C++. Qui non ti interessa affatto il codice ma vuoi dire al tuo compilatore e tutti usano le tue classi base/derivate che questa classe derivata è un tipo speciale di classe base, ha tutte le proprietà della classe base, si comporta esattamente come classe base, nella misura in cui è visibile all'utente, e può essere utilizzato al posto della classe base in qualsiasi algoritmo.
Ereditarietà del codice. Hai una parte di codice nella classe base che vuoi riutilizzare nella tua classe derivata. La classe base e la classe derivata non devono essere correlate in alcun modo, vuoi solo riutilizzare il codice e basta.
eredità pubblico in C++ è il mix di entrambi i tipi, si ottiene l'ereditarietà di interfaccia e si ottiene il codice eredità pure. L'ereditarietà privata è un tipo diverso di bestie, si ottiene l'ereditarietà del codice solo, gli utenti della classe derivata non possono usarlo al posto della classe base e dalla base delle prospettive utente e le classi derivate non hanno alcuna relazione.
struct Base {};
struct PublicDerived : public Base {};
struct PrivateDerived: private Base {};
Base * base; PublicDerived * public_derived; PrivateDerived * private_derived;
base = public_derived; //good
base = private_derived; //compilation error.
Dal momento che si desidera cambiare l'interfaccia, è non dovrebbe andare con l'ereditarietà pubblica, modificando l'interfaccia che si efficacemente dicendo che queste due classi hanno un comportamento differente e non possono essere usati in modo intercambiabile. Quindi quello che vuoi veramente è ereditare privatamente e quindi rendere tutti i metodi che vuoi pubblici e non il contrario allo.
+1: Può essere fatto, ma era pensato per garantire l'accesso, non per limitarlo. –
Ho scelto questa risposta come risposta accettata semplicemente dall'aspetto della funzione linguistica, non dall'aspetto delle migliori pratiche OOD. – powerboy
-1 per l'uso di 'Base :: pippo' deprecato invece di' usando Base :: pippo' – Walter