2013-05-04 17 views
5

Desidero che i membri siano ereditati come privati. Penso di aver visto un esempio di renderli pubblici, tuttavia questo fatto deriva da una parola chiave privata. La mia domanda: come si fa, e se è possibile, allora non dovrebbe essere proibito?è possibile ereditare la classe privata ma rendere pubblici i membri?

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    int i; 
    //can make a public again? 
}; 

risposta

5

come farlo?

perfettamente possibile, utilizzare la parola chiave using.

non dovrebbe essere proibito?

Non necessario. Puoi sempre restituire ai membri indietro la loro accessibilità ma non più di quanto non fosse inizialmente. Quindi, se la classe base ha inizialmente dichiarato qualcosa di pubblico ed è stata solo la tua idea/restrizione a renderlo privato, questo non fa male alla classe base se lasci questa restrizione e la lasci pubblica, tutto sommato era pubblica a l'inizio. Citare da "Linguaggio di programmazione C++" sarà di grande aiuto qui.

Una dichiarazione using non può essere utilizzata per ottenere l'accesso a supplementari informazioni. È semplicemente un meccanismo per che rende più accessibili le informazioni .

quindi se fosse accessibile in classe di base, e si deriva la classe con protected o private parola chiave è possibile rimuovere questa restrizione e tornare indietro il loro livello iniziale di accesso da parte di "trasporto" loro di parte appropriata (public,protected,private) nella definizione della classe derivata.

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    using U::b; 
    using U::a; 
}; 

int main(int argc, char** argv) { 

    V v; 
    printf("\nV: %d %d %d",v.a,v.a,v.b); 

    U u; 
    printf("\nU: %d %d %d",u.a,u.a,u.a); 

    return 0; 
} 
+3

Non vero. L'OP sta chiedendo informazioni sui membri di dati * private *. –

+0

OP sta chiedendo di 'U :: c', che è privato in' U'. – juanchopanza

+1

@AndyProwl no intendevo naturalmente un // –

6

Non è possibile effettuare c pubblico perché è privato a U e non accessibile dal V (oltre, un disegno che richiederebbe che è probabilmente viziata, in quanto violerebbe l'incapsulamento - una classe non deve sapere/cura dei membri private di altre classi).

Tuttavia, lo stesso non è vero per protected e public membri, il cui livello di accesso può essere sovrascritta classi derivate attraverso una dichiarazione using. Per esempio:

class V : private U{ 
public: 
    int i; 

    using U::a; 
// ^^^^^^^^^^^ Gives "a" public accessibility 

    using U::b; 
// ^^^^^^^^^^^ Gives "b" public accessibility 

    // using U::c; // ERROR! c is not accessible from V 

}; 

È possibile che questo renderebbe b accessibile dal codice client esterno alla V e U:

int main() 
{ 
    V v; 
    v.a = 42; // OK 
    v.b = 1729; // OK 
} 
+0

dispiace, volevo dire una, naturalmente, c non era pubblica –

+0

@authority: Oh, OK allora. Bene, la risposta è ancora valida :) –

3

Non è possibile effettuare U::c pubblico, perché è private-U, quindi non si può accedere da V. Se fosse public o protected, allora si potrebbe, con una dichiarazione using.Pertanto, è possibile effettuare U::a e U::b pubblico, ma non U::c:

class V : private U{ 
public: 
    int i; 
    //can make c public again? 
    using U::c; // ERROR: only if U::c is public or protected in U 
    using U::a; // OK 
    using U::b; // OK 
}; 
+0

grazie mille –

Problemi correlati