Verschil tussen private, publieke en beschermde erfenissen

Wat is het verschil tussen public, private, en protected inheritance in C++? Alle vragen die ik'heb gevonden op SO gaan over specifieke gevallen.

Oplossing

Om die vraag te beantwoorden, wil ik'eerst in mijn eigen woorden de accessors van member's beschrijven. Als je dit al weet, sla dan over naar de kop "next:".

Er zijn drie accessors die ik'ken: public, protected en private.

Laten:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • Alles wat zich bewust is van Base weet ook dat Base publicMember bevat.
  • Alleen de kinderen (en hun kinderen) zijn zich ervan bewust dat Base protectedMember bevat.
  • Niemand anders dan Base is zich bewust van privateMember.

Met "is zich bewust van" bedoel ik "erkent het bestaan van, en kan er dus toegang toe krijgen".

volgende:

Hetzelfde gebeurt met publieke, private en beschermde overerving. Laten we eens kijken naar een klasse Base en een klasse Child die erft van Base.

  • Als de overerving public is, weet alles wat op de hoogte is van Base en Child ook dat Child erft van Base.
  • Als de overerving beschermd is, weten alleen Kind, en zijn kinderen, dat ze erven van Basis.
  • Als de overerving private is, weet niemand anders dan Child van de overerving.
Commentaren (12)

Het heeft te maken met hoe de publieke leden van de basisklasse worden blootgesteld aan de afgeleide klasse.

  • public -> de publieke leden van de basisklasse's zullen publiek zijn (gewoonlijk de standaardinstelling)
  • protected -> de publieke leden van de basisklasse zullen protected zijn
  • private -> de publieke leden van de basisklasse zullen private leden zijn

Zoals litb opmerkt, is publieke overerving de traditionele overerving die je'in de meeste programmeertalen ziet. Dat wil zeggen dat het een "IS-A" relatie modelleert. Private overerving, iets wat AFAIK eigen is aan C++, is een "IMPLEMENTED IN TERMS OF" relatie. Dat wil zeggen dat je de publieke interface wilt gebruiken in de afgeleide klasse, maar niet wilt dat de gebruiker van de afgeleide klasse toegang heeft tot die interface. Velen argumenteren dat je in dit geval de basisklasse zou moeten aggregeren, dat is in plaats van de basisklasse als een private basis te hebben, er een lid van derived van maken om de functionaliteit van de basisklasse te hergebruiken's.

Commentaren (2)

Het gaat in wezen om de toegangsbescherming van de openbare en beschermde leden van de basisklasse in de afgeleide klasse. Met openbare overerving kan de afgeleide klasse de openbare en beschermde leden van de basisklasse zien. Met private overerving kan dat niet. Met protected kan de afgeleide klasse en alle daarvan afgeleide klassen ze zien.

Commentaren (0)