Członkowie prywatni są dostępni tylko w obrębie klasy, która je definiuje.
Członkowie chronieni są dostępni w klasie, która je definiuje, oraz w klasach dziedziczących po tej klasie.
Edycja: Oba są również dostępne dla przyjaciół z ich klasy, a w przypadku członków chronionych - dla przyjaciół z ich klas pochodnych.
Edycja 2: Używaj czegokolwiek, co ma sens w kontekście twojego problemu. Powinieneś próbować uczynić członków prywatnymi, ilekroć możesz, aby zmniejszyć sprzężenie i chronić implementację klasy podstawowej, ale jeśli nie jest to możliwe, użyj chronionych członków. Sprawdź C ++ FAQ, aby lepiej zrozumieć problem. To pytanie dotyczące chronionych zmiennych może również pomóc.
Członkowie publiczni klasy A są dostępni dla wszystkich i dla wszystkich.
Chronione elementy klasy A nie są dostępne poza kodem A, ale są dostępne z kodu dowolnej klasy pochodnej A.
Prywatni członkowie klasy A nie są dostępni poza kodem A ani z kodu żadnej klasy pochodzącej od A.
Tak więc ostatecznie wybór między chronionym a prywatnym stanowi odpowiedź na następujące pytania: Ile zaufania jesteś gotów obdarzyć programistę klasy pochodnej?
Domyślnie załóż, że klasie pochodnej nie można ufać, i uczyń swoich członków prywatnymi . Jeśli masz bardzo dobry powód, aby zapewnić bezpłatny dostęp do wewnętrznych elementów klasy macierzystej do jej klas pochodnych, możesz je zabezpieczyć.
źródło
the protected data of the base class is part of the data of the derived class.
Rzeczywiście. Czy nie lepiej jest zatem, aby autor klasy pochodnej zadeklarował te dane w swojej klasie zamiast mojej? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
W schemacie NVI celem jest uczynienie wszystkiego prywatnym, w tym metody, aby ograniczyć szkody, jakie pisarz klas pochodnych mógłby wyrządzić hierarchii. Metody chronione są już potencjalnym problemem. Nie jestem przekonany, że pogłębienie tego poprzez użycie stanu chronionego jest właściwym podejściem.Dostęp do członków chronionych można uzyskać z klas pochodnych. Prywatne nie mogą.
To zależy od „najlepszych praktyk”. Jeśli istnieje choćby niewielka możliwość, że ktoś może chcieć czerpać nową klasę z istniejącej klasy i potrzebować dostępu do wewnętrznych członków, uczyń ich chronionymi, a nie prywatnymi. Jeśli są prywatne, twoja klasa może być trudna do odziedziczenia.
źródło
Powodem, dla którego MFC preferuje ochronę, jest to, że jest to framework. Prawdopodobnie chcesz podklasować klasy MFC. W takim przypadku potrzebny jest chroniony interfejs, aby uzyskać dostęp do metod niewidocznych dla ogólnego użycia klasy.
źródło
Wszystko zależy od tego, co chcesz zrobić i od tego, co mają widzieć klasy pochodne.
źródło
Atrybuty i metody oznaczone jako
protected
są - w przeciwieństwie do prywatnych - nadal widoczne w podklasach.Chyba, że nie chcesz używać ani nie umożliwiać zastąpienia metody w możliwych podklasach
private
.źródło
Spójrz na pytanie dotyczące chronionych zmiennych członkowskich . Zalecane jest użycie wartości domyślnej private (podobnie jak C ++
class
ses do), aby zmniejszyć sprzężenie. Chronione zmienne składowe są zawsze złym pomysłem, chronione funkcje składowe można wykorzystać np. Do wzorca metody szablonu.źródło
Dostęp do członków chronionych mogą uzyskać wyłącznie potomkowie klasy i kod w tym samym module. Członkowie prywatni mogą być dostępni tylko przez klasę, w której są zadeklarowani, oraz przez kod w tym samym module.
Oczywiście funkcje znajomych wyrzucają to przez okno, ale no cóż.
źródło
członkowie prywatni są dostępni tylko wewnątrz klasy, członkowie chronieni są dostępni w klasie i klasach pochodnych. Jest to funkcja dziedziczenia w językach OO.
Możesz mieć prywatne, chronione i publiczne dziedziczenie w C ++, które określi, do których klas pochodnych może uzyskać dostęp w hierarchii dziedziczenia. Na przykład C # ma tylko dziedzictwo publiczne.
źródło
prywatny = dostępny tylko dla statku-matki (klasa podstawowa) (tzn. tylko mój rodzic może wejść do sypialni mojego rodzica)
chroniony = dostępny dla statku-matki (klasa podstawowa) i jej córek (tzn. tylko mój rodzic może wejść do sypialni mojego rodzica, ale dał synowi / córce pozwolenie na wejście do sypialni rodzica)
public = dostępny dla statku-matki (klasa podstawowa), córki i wszystkich innych (tj. tylko mój rodzic może wejść do sypialni mojego rodzica, ale jest to impreza domowa - mi casa su casa)
źródło
Ponieważ żadna funkcja publiczna nie jest potrzebna do pobierania i aktualizowania chronionych elementów w klasie pochodnej, zwiększa to efektywność kodu i zmniejsza ilość kodu, który musimy napisać. Jednak programista klasy pochodnej powinien być świadomy tego, co robi.
źródło
private
jest preferowany dla danych członka. Członkowie klas C ++ sąprivate
domyślnie.public
jest preferowany dla funkcji składowych, choć jest to kwestia opinii. Przynajmniej niektóre metody muszą być dostępne.public
jest dostępny dla wszystkich. Jest to najbardziej elastyczna opcja i najmniej bezpieczna. Każdy może z nich korzystać i każdy może ich niewłaściwie używać.private
jest w ogóle niedostępny. Nikt nie może ich używać poza klasą i nikt nie może ich nadużywać. Nawet w klasach pochodnych.protected
jest kompromisem, ponieważ można go stosować w klasach pochodnych. Kiedy wywodzisz się z klasy, dobrze rozumiesz klasę podstawową i uważasz, aby nie nadużywać tych członków.MFC to opakowanie C ++ dla Windows API, preferuje
public
iprotected
. Klasy generowane przez Visual Studio Kreator mają brzydki mieszankęprotected
,public
orazprivate
członków. Ale istnieje pewna logika dla samych klas MFC.Członkowie tacy
SetWindowText
są,public
ponieważ często trzeba uzyskać do nich dostęp.Członkowie, na przykład
OnLButtonDown
, obsługują powiadomienia otrzymane przez okno. Nie powinny być one dostępne, dlatego sąprotected
. Nadal możesz uzyskać do nich dostęp w klasie pochodnej, aby zastąpić te funkcje.Niektórzy członkowie muszą wykonywać wątki i pętle wiadomości, nie należy do nich uzyskiwać dostępu ani nadpisywać, więc są zadeklarowani jako
private
W strukturach C ++ członkowie są
public
domyślnie. Struktury są zwykle używane tylko do danych, a nie do metod, dlategopublic
deklaracja jest uważana za bezpieczną.źródło
private
domyślnie jest to Visual Studio. Toprivate
domyślnie w gcc, jak również, że nigdy nie jestpublic
domyślnie. Chyba że znowu się mylę. Nie mogę znaleźć standardu, o którym mowa.Dostęp do członka prywatnego można uzyskać tylko w tej samej klasie, w której zadeklarował, gdzie jako członek chroniony można uzyskać dostęp w klasie, w której jest zadeklarowany wraz z klasami przez niego dziedziczonymi.
źródło
Prywatny : jest to specyfikator dostępu. Domyślnie zmienne instancji (członka) lub metody klasy w c ++ / java są prywatne. Podczas dziedziczenia kod i dane są zawsze dziedziczone, ale nie są dostępne poza klasą. Możemy zadeklarować naszych członków danych jako prywatnych, aby nikt nie mógł dokonywać bezpośrednich zmian w naszych zmiennych członkowskich, a także zapewnić publiczne obiekty pobierające i ustawiające w celu zmiany naszych prywatnych członków. Ta koncepcja jest zawsze stosowana w regule biznesowej.
Protected : Jest to także specyfikator dostępu. W C ++ chronione elementy są dostępne w klasie i klasie dziedziczonej, ale nie poza nią. W Javie chronione elementy są dostępne w obrębie klasy, dla odziedziczonej klasy, a także dla wszystkich klas w tym samym pakiecie.
źródło
Dostęp do chronionego niestatycznego członka klasy podstawowej mogą uzyskać członkowie i przyjaciele dowolnej klasy wywodzącej się z tej klasy podstawowej, korzystając z jednego z następujących sposobów:
źródło
Prywatny: dostępny przez funkcje członka klasy i funkcję przyjaciela lub klasę przyjaciela. W przypadku klasy C ++ jest to domyślny specyfikator dostępu.
Chronione: Dostępne przez funkcje członka klasy, funkcję znajomego lub klasę znajomego i klasy pochodne.
Zobacz ten link, aby uzyskać więcej szczegółów.
źródło
modyfikatory dostępu prywatnego i chronionego są jednym i tym samym, że dostęp do chronionych członków klasy podstawowej można uzyskać poza zakresem klasy podstawowej w klasie potomnej (pochodnej). To samo dotyczy dziedziczenia. Ale dzięki modyfikatorowi prywatnemu członkowie klasy podstawowej mogą być dostępni tylko w zakresie lub kodzie klasy podstawowej, a jej funkcje znajomych są tylko
źródło