Anonieme gebruiker
Meer
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.
947
3
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
enprivate
.Laten:
Base
weet ook datBase
publicMember
bevat.Base
protectedMember
bevat.Base
is zich bewust vanprivateMember
.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 klasseChild
die erft vanBase
.public
is, weet alles wat op de hoogte is vanBase
enChild
ook datChild
erft vanBase
.beschermd
is, weten alleenKind
, en zijn kinderen, dat ze erven vanBasis
.private
is, weet niemand anders danChild
van de overerving.Het heeft te maken met hoe de publieke leden van de basisklasse worden blootgesteld aan de afgeleide klasse.
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.
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.