2010-09-02 13 views
5

voglio fare fare un membro pubblico in una classe base privata in una classe derivata, in questo modo:Posso rendere privata una variabile membro pubblica in una classe derivata?

class A { 
public: 
    int x; 
    int y; 
}; 

class B : public A { 
    // x is still public 
private: 
    // y is now private 
    using y; 
}; 

Ma a quanto pare "con" non può essere utilizzato in questo modo. C'è un modo per farlo in C++?

(Non posso usare l'ereditarietà privata perché ci sono altri membri e le funzioni di una che deve ancora essere pubblica.)

+1

Questo sembra un design scomodo. Anche se puoi farlo per la classe B, tutto ciò che qualcuno dovrebbe fare è upcast verso un puntatore o riferimento ad A e quindi sarebbero in grado di accedere al membro. – TheUndeadFish

+1

Possibile duplicato di [C++: come ereditare pubblicamente da una classe base, ma rendere alcuni metodi pubblici dalla classe base privata nella classe derivata?] (Http://stackoverflow.com/questions/2986891/c-how-to -publicly-eredita-da-a-base-class-ma-make-some-of-pubblici-metodi-FR) –

risposta

3

Risposta breve: no. La sostituzione di Liskov e la natura dell'eredità pubblica richiedono che tutto ciò che si può fare con uno A (ovvero i suoi membri pubblici) possa essere eseguito anche tramite B. Ciò significa che non puoi nascondere un metodo pubblico.

Se stai cercando di nascondere pubblico fields, non c'è molto che tu possa fare. Per "nascondere" i metodi pubblici, si potrebbe fare qualcosa di simile:

class B { 
    // x is still public 
    int x() { return a.x(); } 
private: 
    A a; 
    // y is now private since you didn't add a forwarding method for it 
}; 
3

Sì, utilizzando dichiarazione technically permette di farlo.

devi usare using A::y invece di using y

Tuttavia si prega di valutare seriamente se facendo questo ha un senso di design.

alcune osservazioni:

  1. La classe non dovrebbe avere dati pubblici. Questo dovrebbe essere evitato il più possibile. Se ti attieni a questo principio di progettazione, potresti non avere la necessità di renderlo privato nella classe derivata.

  2. Stick a LSP. Se una classe base ha un metodo pubblico e, a meno che non si stia eseguendo un'ereditarietà privata, i client verranno confusi se la classe derivata rende privato il metodo della classe base con tali dichiarazioni di utilizzo.

Problemi correlati