Jaka jest różnica między prywatnymi a chronionymi członkami klas C++?

Jaka jest różnica pomiędzy private i protected w klasach C++?

Z najlepszych praktyk rozumiem, że zmienne i funkcje, które nie są wywoływane poza klasą, powinny być tworzone private - ale patrząc na mój projekt MFC, MFC wydaje się faworyzować protected.

Jaka jest różnica i którego powinienem użyć?

Author: Cody Gray, 2008-10-22

17 answers

Private members są dostępne tylko w obrębie definiującej je klasy.

Protected members są dostępne w klasie, która je definiuje oraz w klasach, które dziedziczą z tej klasy.

Edit: oba są również dostępne dla przyjaciół z ich klasy, a w przypadku chronionych członków-dla przyjaciół z ich klas pochodnych.

Edit 2: używaj tego, co ma sens w kontekście Twojego problemu. Powinieneś starać się, aby członkowie byli prywatni, kiedy tylko możesz, aby zmniejszyć sprzężenie i Chroń implementację klasy bazowej, ale jeśli nie jest to możliwe, użyj protected members. Sprawdź C++ FAQ , aby lepiej zrozumieć problem. to pytanie o chronione zmienne może również pomóc.

 396
Author: Firas Assaad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 15:46:30

Public Członkowie klasy A są dostępni dla wszystkich i dla wszystkich.

Protected Członkowie klasy a nie są dostępni poza kodem A, ale są dostępni z kodu dowolnej klasy wywodzącej się z A.

Klasy A nie są dostępne poza kodem A, ani z kodu żadnej klasy wywodzącej się z A.

Tak więc, w końcu, wybór pomiędzy chronionym a prywatnym jest odpowiedzią na następujące pytania: Ile jest zaufania jesteś gotów umieścić w programistę klasy pochodnej?

Domyślnie , Załóżmy, że klasa pochodna nie ma być zaufana i uczyń członków prywatnymi. Jeśli masz bardzo dobry powód, aby dać darmowy dostęp do wewnętrznych klas macierzystych do klas pochodnych, możesz je zabezpieczyć.

 142
Author: paercebal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:22:10

Protected members mogą być dostępne z klas pochodnych. Prywatne nie mogą.

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};
Jeśli chodzi o "najlepsze praktyki", to zależy. Jeśli istnieje choćby niewielka możliwość, że ktoś może chcieć wyprowadzić nową klasę z Twojej istniejącej i potrzebować dostępu do wewnętrznych członków, uczyń je chronionymi, a nie prywatnymi. Jeśli są prywatne, twoja klasa może stać się trudna do odziedziczenia z łatwością.
 67
Author: Roddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-04 11:53:17

Powodem, dla którego MFC faworyzuje protected, jest to, że jest to framework. Prawdopodobnie chcesz podklasować klasy MFC i w takim przypadku potrzebny jest chroniony interfejs, aby uzyskać dostęp do metod, które nie są widoczne dla ogólnego użytku klasy.

 24
Author: Toon Krijthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:19:01

Wszystko zależy od tego, co chcesz zrobić i co chcesz, aby klasy pochodne były w stanie zobaczyć.

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}
 10
Author: Mats Fredriksson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:26:52

Atrybuty i metody oznaczone jako protected są-w przeciwieństwie do prywatnych-nadal widoczne w podklasach.

Jeśli nie chcesz użyć lub zapewnić możliwości nadpisania metody w możliwych podklasach, zrobię je private.

 6
Author: fhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:14:53

Oczywiście spójrz na pytanie chronione zmienne Członkowskie . Zalecane jest użycie domyślnego private (podobnie jak C++ classses do)w celu zmniejszenia sprzężenia. Chronione zmienne członkowskie są najczęściej złym pomysłem, chronione funkcje Członkowskie mogą być używane np. do wzorca metody szablonu.

 6
Author: xtofl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32

Protected members mogą być dostępne tylko przez potomków klasy i przez KOD w tym samym module. Do członków prywatnych można uzyskać dostęp tylko za pomocą klasy, w której są zadeklarowane, oraz za pomocą kodu w tym samym module.

Oczywiście funkcje przyjaciół wyrzuć to przez okno, ale cóż.

 4
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:15:35

Private members są dostępne tylko z poziomu klasy, protected members są dostępne w klasie i klasach pochodnych. Jest to cecha dziedziczenia w językach OO.

Możesz mieć prywatne, chronione i publiczne dziedziczenie w C++, które określi, do jakich klas pochodnych można uzyskać dostęp w hierarchii dziedziczenia. Na przykład C# ma tylko publiczne dziedziczenie.

 4
Author: PhilGriffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 09:26:32

Private = dostępne tylko dla statku macierzystego (klasy bazowej) (tzn. tylko mój rodzic może wejść do sypialni mojego rodzica)

Protected = dostępne dla statku matki (klasy bazowej) i jej córek (tj. 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ępne dla statku matki (klasy bazowej), córki i wszystkich innych (czyli tylko mój rodzic może wejść do sypialni mojego rodzica, ale jest to dom party-mi casa su casa)

 3
Author: Johan K. Rhodes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-01 16:02:20

Ponieważ żadna publiczna funkcja członka nie jest potrzebna do pobierania i aktualizowania chronionych członków w klasie pochodnej, Zwiększa to wydajność kodu i zmniejsza ilość kodu, który musimy napisać. Jednak programista klasy pochodnej powinien być świadomy tego, co robi.

 2
Author: null,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 14:04:32

private jest preferowany dla danych członkowskich. Członkowie klas C++ są domyślnie private.

public jest preferowany do pełnienia funkcji Członkowskich, choć jest to kwestia opinii. Przynajmniej niektóre metody muszą być dostępne. public jest dostępna dla wszystkich. Jest to najbardziej elastyczna opcja i najmniej bezpieczna. Każdy może z nich korzystać i każdy może je nadużywać.

private nie jest dostępny w ogóle. Nikt nie może ich używać poza klasą i nikt nie może ich nadużywać. Nawet w pochodnej klasy.

protected jest kompromisem, ponieważ może być używany w klasach pochodnych. Kiedy wywodzisz się z klasy, masz dobre zrozumienie klasy bazowej i jesteś ostrożny, aby nie nadużywać tych członków.

MFC jest opakowaniem C++ Dla Windows API, preferuje public i protected. Klasy generowane przez Visual Studio wizard mają brzydką mieszankę protected, public, i private członków. Ale jest trochę logiki do samych klas MFC.

Członkowie tacy jak SetWindowTextpublic, Ponieważ ty często trzeba uzyskać dostęp do tych członków.

Członkowie, tacy jak OnLButtonDown, zajmują się powiadomieniami otrzymywanymi przez okno. Nie powinny być dostępne, dlatego są protected. Nadal można uzyskać do nich dostęp w klasie pochodnej, aby nadpisać te funkcje.

Niektórzy członkowie muszą wykonywać wątki i pętle wiadomości, nie powinny być dostępne ani nadpisywane, więc są zadeklarowane jako private

W strukturach C++ członkowie są domyślnie public. Struktury są zwykle używane tylko do danych, a nie metody, dlatego deklaracja public jest uważana za bezpieczną.

 2
Author: Barmak Shemirani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 15:28:53

Private: dostępne przez funkcje członka klasy & friend function lub friend class. Dla klasy C++ jest to domyślne określenie dostępu.

Protected: Accessible by class member functions, friend function lub friend class & derived classes.

  • możesz zachować zmienną lub funkcję członka klasy (nawet typedefs lub klasy wewnętrzne) jako prywatną lub chronioną zgodnie z wymaganiami.
  • przez większość czasu zachowujesz członka klasy jako prywatnego i dodajesz get / set funkcje do hermetyzacji. Pomaga to w utrzymaniu kodu.
  • ogólnie funkcja prywatna jest używana, gdy chcesz zachować modułowość funkcji publicznych lub wyeliminować powtarzający się kod zamiast zapisywać cały kod do pojedynczej funkcji. Pomaga to w utrzymaniu kodu.

Więcej szczegółów można znaleźć pod tym linkiem.

 2
Author: Darshan Rajgor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-25 11:45:56
  • Private: jest to specyfik dostępu. Domyślnie zmienne instancji (member) 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ł wprowadzać bezpośrednich zmian do naszych zmiennych członkowskich i możemy zapewnić publiczne gettery i settery w celu zmiany naszych prywatnych członków. I ta koncepcja jest zawsze stosowana w zasada biznesu.

  • Protected: jest to również Specyfikacja dostępu. W C++, protected members są dostępne wewnątrz klasy i do dziedziczonej klasy, ale nie poza klasą. W Javie protected members są dostępne w ramach klasy, dziedziczonej klasy, jak również dla wszystkich klas w ramach tego samego pakietu.

 1
Author: Tutu Kumari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 12:50:22

Private member moĹźe byÄ ‡ dostÄ ™ pny tylko w tej samej klasie, gdzie zadeklarowaĺ', gdzie jako protected member moĹźe byÄ ‡ dostÄ ™ pny w klasie, gdzie jest zadeklarowany wraz z klasami, ktĂłre sÄ ... przez niego dziedziczone .

 0
Author: Gayki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 14:38:29

Chroniony niestatyczny element klasy bazowej może być dostępny dla członków i przyjaciół dowolnych klas wywodzących się z tej klasy bazowej za pomocą jednej z następujących metod:

  • wskaźnik do bezpośrednio lub pośrednio pochodnej klasy
  • odniesienie do klasy bezpośrednio lub pośrednio pochodnej
  • obiekt klasy bezpośrednio lub pośrednio pochodnej
 0
Author: mujtaba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 14:01:36

Modyfikatory dostępu prywatnego i chronionego są tymi samymi tylko, że chronione elementy klasy bazowej mogą być dostępne poza zakresem klasy bazowej w klasie potomnej (pochodnej). To samo dotyczy również dziedziczenia . Ale z modyfikatorem prywatnym Członkowie klasy bazowej mogą być dostępne tylko w zakresie lub kodzie klasy bazowej i jej funkcji przyjacielskich tylko ""

 -2
Author: Emmanuel Muniko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 08:45:46