2009-10-14 12 views
21

Dato questo classe di base:Uso di "Pubblico" in una dichiarazione di classe derivata?

class Employee 
{ 
    char* name; 
    int age; 

    public: 
    Employee(char* name); 
    void print(); 
}; 

per quanto riguarda il "pubblico", qual è la differenza tra questo:

class Manager : public Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 

e questo:

class Manager : Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 
+4

Utilizzare std :: string su char *, e std :: vector su un puntatore-a-array. – GManNickG

+4

Non sono d'accordo. std :: string aggiunge uno strato di overhead per consentire dati di lunghezza variabile. Dovresti considerare i tuoi bisogni e scegliere con saggezza. – sep

+2

Senza una buona conoscenza del contesto, i consigli per usare "std :: vectors" invece di C-array e "std :: string" invece di C-string hanno un valore molto basso, se esiste. – AnT

risposta

3

Senza questo 'pubblico' 'Dipendente' diventerebbe una classe base privata di 'Manager'.

Le classi dichiarate con la parola chiave "class" hanno i loro membri privati ​​per impostazione predefinita e hanno le loro classi di base private per impostazione predefinita.

Le classi dichiarate con la parola chiave "struct" hanno i loro membri di default in pubblico e hanno le loro classi di base pubbliche per impostazione predefinita.

0

In C++, l'ereditarietà è privata per impostazione predefinita. Tuttavia, per qualsiasi codice che utilizzi la classe Manager, sembra che non ci sia praticamente alcuna differenza, dal momento che hanno gli stessi metodi.

Non sarà tuttavia possibile eseguire il cast dell'oggetto Manager su un Dipendente. Inoltre, non sarà possibile accedere alla variabile employees dalla classe Manager.

+0

Il tipo di ereditarietà predefinito in C++ dipende dalla chiave di classe utilizzata nella dichiarazione della classe. 'classe' - privata, 'struct' - pubblica. – AnT

+0

Sì, ma l'OP sta utilizzando una classe, quindi questo è vero in questo contesto. –

+2

Sì, in questo contesto. Ma non "in C++". "In C++" suggerisce un contesto significativamente più generale, secondo me. – AnT

31

L'impostazione predefinita è l'ereditarietà privata. prendi questo esempio:

class B { }; 
class D: B { }; 

utilizza l'ereditarietà privata come impostazione predefinita. Ciò significa che D ottiene tutti i campi e metodi che B ha (se abbiamo effettivamente dichiarato qualsiasi) protette e pubbliche, ma non può essere lanciato a un B. Pertanto, questo codice non riesce:

void foo(B* argument) {} 
foo(new D);     //not allowed 

Se D pubblicamente ereditato da B, quindi una D può essere trasmessa a una B, e questa chiamata di funzione andrebbe bene.

La seconda differenza è che tutti i protetti e membri pubblici in B diventano privati ​​ membri in D.

Cosa significa in concreto? L'ereditarietà significa D IS_A B, ma l'ereditarietà privata significa "è implementata in termini di". Ereditare D da B significa che si desidera sfruttare alcune delle funzionalità di B, ma non perché D IS_A B o perché esiste una connessione concettuale tra B e D.: D

+1

Risposta fantastica! –

+0

Perfetto, proprio quello che stavo cercando! –

+0

grazie, per altri come me, questo diventerebbe più chiaro dopo aver letto questo prima: http://stackoverflow.com/a/1372858/1511337 –

Problemi correlati