Wat is het verschil tussen particuliere en beschermde leden van C++ -klassen?

Wat is het verschil tussen privateen protectedleden in C++ -klassen?

Ik begrijp het van de beste praktijkconventies die variabelen en -functies die niet buiten de klasse worden gebeld, moeten worden gemaakt private-Maar Kijkend naar mijn MFC-project, MFC lijkt te begunstigen protected.

Wat is het verschil en welke moet ik gebruiken?


Antwoord 1, Autoriteit 100%

particuliere leden zijn alleen toegankelijk binnen de klasse die ze definiëren.

Beschermde leden zijn toegankelijk in de klas die ze definieert en in klassen die van die klasse erven.

EDIT: beide zijn ook toegankelijk door vrienden van hun klasse, en in het geval van beschermde leden, door vrienden van hun afgeleide klassen.

EDIT 2: Gebruik alles wat logisch is in de context van uw probleem. Je moet proberen leden privé te maken wanneer je kunt om het koppelen te verminderen en de implementatie van de basisklasse te beschermen, maar als dat niet mogelijk is, gebruik dan beschermde leden. Controleer C++ FAQ voor een beter begrip van het probleem. Deze vraag over beschermde variabelen kan ook helpen.


Antwoord 2, Autoriteit 36%

openbaar leden van een klasse A zijn toegankelijk voor iedereen en iedereen.

beschermd leden van een klasse A zijn niet toegankelijk buiten de A-code, maar zijn toegankelijk vanuit de code van elke klas die is afgeleid van a.

Private Leden van een klasse A zijn niet toegankelijk buiten de A-code of uit de code van elke klas afgeleid van a.

Dus uiteindelijk is het kiezen tussen beschermd of privé het beantwoorden van de volgende vragen: Hoeveel vertrouwen bent u bereid te stellen in de programmeur van de afgeleide klasse?

Standaard, ga ervan uit dat de afgeleide klasse niet te vertrouwen is, en maak je leden privé. Als je een hele goede reden hebt om gratis toegang te geven tot de interne klassen van de moederklasse, dan kun je ze beschermen.


Antwoord 3, autoriteit 18%

Beschermde leden zijn toegankelijk vanuit afgeleide klassen. Particulieren kunnen dat niet.

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
};

In termen van ‘best practice’ hangt het ervan af. Als er zelfs maar een vage mogelijkheid is dat iemand een nieuwe klas wil afleiden uit uw bestaande en toegang nodig heeft tot interne leden, maak ze dan Beschermd, niet Privé. Als ze privé zijn, kan het moeilijk worden om van je klas te erven.


Antwoord 4, autoriteit 6%

De reden dat MFC de voorkeur geeft aan beveiligd, is omdat het een framework is. U wilt waarschijnlijk de MFC-klassen onderklassen en in dat geval is een beveiligde interface nodig om toegang te krijgen tot methoden die niet zichtbaar zijn voor algemeen gebruik van de klasse.


Antwoord 5, autoriteit 2%

Het hangt allemaal af van wat je wilt doen en wat je wilt dat de afgeleide klassen kunnen zien.

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(); // will work, simply calls the derived version.
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

Antwoord 6

Attributen en methoden gemarkeerd als protectedzijn — in tegenstelling tot privé — nog steeds zichtbaar in subklassen.

Tenzij u de methode in mogelijke subklassen niet wilt gebruiken of de mogelijkheid wilt bieden om deze te overschrijven, zou ik ze privatemaken.


Antwoord 7

Neem zeker een kijkje bij de vraag Beschermde lidvariabelen. Het wordt aanbevolen om privé als standaard te gebruiken (net zoals C++ classses doen) om koppeling te verminderen. Beveiligde lidvariabelen zijn meestal een slecht idee, beschermde lidfuncties kunnen worden gebruikt voor b.v. het patroon Sjabloonmethode.


Antwoord 8

Beschermde leden zijn alleen toegankelijk voor afstammelingen van de klas en met code in dezelfde module. Privéleden zijn alleen toegankelijk via de klasse waarin ze zijn gedeclareerd en via code in dezelfde module.

Natuurlijk gooien vriendenfuncties dit uit het raam, maar ach.


Antwoord 9

private leden zijn alleen toegankelijk vanuit de klas, beveiligde leden zijn toegankelijk in de klas en afgeleide klassen. Het is een eigenschap van overerving in OO-talen.

Je kunt privé, beschermde en openbare overerving hebben in C++, die bepaalt tot welke afgeleide klassen toegang hebben in de overervingshiërarchie. C# heeft bijvoorbeeld alleen openbare overerving.


Antwoord 10

privé= alleen toegankelijk via het moederschip (basisklasse)
(dwz alleen mijn ouder mag de slaapkamer van mijn ouders in)

beschermd= toegankelijk per moederschip (basisklasse) en haar dochters
(dwz alleen mijn ouder mag de slaapkamer van mijn ouders in, maar gaf zoon/dochter toestemming om de slaapkamer van de ouders in te lopen)

openbaar= toegankelijk per moederschip (basisklasse), dochter en alle anderen
(dwz alleen mijn ouder mag de slaapkamer van mijn ouders binnen, maar het is een huisfeest – mi casa su casa)


Antwoord 11

Omdat er geen openbare lidfunctie nodig is om beveiligde leden in de afgeleide klasse op te halen en bij te werken, verhoogt dit de efficiëntie van code en vermindert het de hoeveelheid code die we moeten schrijven. De programmeur van de afgeleide klasse wordt echter verondersteld zich bewust te zijn van wat hij doet.


Antwoord 12

privateheeft de voorkeur voor ledengegevens. Leden in C++-klassen zijn standaard private.

publicheeft de voorkeur voor ledenfuncties, hoewel dit een kwestie van mening is. Sommige methoden moeten op zijn minst toegankelijk zijn. publicis voor iedereen toegankelijk. Het is de meest flexibele optie en het minst veilig. Iedereen kan ze gebruiken en iedereen kan ze misbruiken.

privateis helemaal niet toegankelijk. Niemand kan ze buiten de klas gebruiken en niemand kan ze misbruiken. Zelfs niet in afgeleide klassen.

protectedis een compromis omdat het kan worden gebruikt in afgeleide klassen. Als je uit een klas komt, heb je een goed begrip van de basisklas en zorg je ervoor dat je deze leden niet misbruikt.

MFC is een C++-wrapper voor Windows API, het geeft de voorkeur aan publicen protected. Klassen gegenereerd door de Visual Studio-wizard hebben een lelijke mix van protected, publicen privateleden. Maar er zit enige logica in de MFC-klassen zelf.

Leden zoals SetWindowTextzijn publicomdat je vaak toegang tot deze leden nodig hebt.

Leden zoals OnLButtonDownverwerken meldingen die door het raam worden ontvangen. Ze mogen niet worden geopend, daarom zijn ze protected. Je kunt ze nog steeds openen in de afgeleide klasse om deze functies te negeren.

Sommige leden moeten threads en berichtloops maken, ze mogen niet worden geopend of genegeerd, dus worden ze als private

gedeclareerd

In C++-structuren zijn leden standaard public. Structuren worden meestal alleen voor gegevens gebruikt, niet voor methoden, daarom wordt de public-declaratie als veilig beschouwd.


Antwoord 13

Privé:Toegankelijk voor klassenlidfuncties & vriendenfunctie of vriendenklasse.
Voor de C++-klasse is dit de standaard toegangsspecificatie.

Beveiligd:Toegankelijk via klassenlidfuncties, vriendenfunctie of vriendenklasse & afgeleide klassen.

  • U kunt klasselidvariabele of -functie (zelfs typedefs of innerlijke klassen) als privé of beschermd houden volgens uw vereisten.
  • Meestal houd je het klaslid privé en voeg je get/set-functies toe om in te kapselen. Dit helpt bij het onderhoud van de code.
  • Over het algemeen wordt de privéfunctie gebruikt wanneer u uw openbare functies modulair wilt houden of herhaalde code wilt elimineren in plaats van hele code naar een enkele functie te schrijven. Dit helpt bij het onderhoud van de code.

Zie deze linkvoor meer details.


Antwoord 14

  • Privé: het is een toegangsspecificatie. Standaard zijn de instantievariabelen (lid) of de methoden van een klasse in c++/java privé. Tijdens overerving worden de code en de gegevens altijd overgenomen, maar zijn ze niet toegankelijk buiten de klasse. We kunnen onze gegevensleden als privé declareren, zodat niemand directe wijzigingen in onze lidvariabelen kan aanbrengen en we kunnen openbare getters en setters leveren om onze privéleden te wijzigen. En dit concept wordt altijd toegepast in de bedrijfsregel.

  • Beveiligd: het is ook een toegangsspecificatie. In C++ zijn de beveiligde leden toegankelijk binnen de klasse en voor de overgeërfde klasse, maar niet buiten de klasse. In Java zijn de beveiligde leden toegankelijk binnen de klasse, zowel voor de overgeërfde klasse als voor alle klassen binnen hetzelfde pakket.


Antwoord 15

Privélid kan alleen worden geopend in dezelfde klasse waar het heeft aangegeven waar het als beschermd lid toegankelijk is in de klasse waar het is gedeclareerd samen met de klassen die erdoor worden geërfd.


Antwoord 16

Een beschermd niet-statisch lid van de basisklasse is toegankelijk voor leden en vrienden van klassen die zijn afgeleid van die basisklasse door een van de volgende opties te gebruiken:

  • Een verwijzing naar een direct of indirect afgeleide klasse
  • Een verwijzing naar een direct of indirect afgeleide klasse
  • Een object van een direct of indirect afgeleide klasse

Antwoord 17

privé- en beveiligde toegangsmodifiers zijn één en dezelfde alleen dat beveiligde leden van de basisklasse toegankelijk zijn buiten het bereik van de basisklasse in de onderliggende (afgeleide) klasse.
Hetzelfde geldt ook voor erfenissen.
Maar met de private modifier zijn de leden van de basisklasse alleen toegankelijk in het bereik of de code van de basisklasse en alleen de bijbehorende vriendfuncties””

Other episodes