Hva er forskjellen mellom offentlig
, privat
og beskyttet
arv i C++? Alle spørsmålene jeg har funnet på SO omhandler spesifikke tilfeller.
For å svare på det spørsmålet vil jeg først beskrive medlemmenes tilganger med mine egne ord. Hvis du allerede vet dette, kan du hoppe til overskriften "neste".
Det er tre tilganger som jeg kjenner til: offentlig
, beskyttet
og privat
.
La:
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
Base
er også klar over at Base
inneholder publicMember
.Base
inneholder protectedMember
.Base
er klar over privateMember
.Med "er klar over" mener jeg "erkjenner eksistensen av, og dermed har tilgang til".
Det samme skjer med offentlig, privat og beskyttet arv. La oss betrakte en klasse Base
og en klasse Child
som arver fra Base
.
offentlig
, er alt som er klar over Base
og Barn
også klar over at Barn
arver fra Base
.beskyttet
, er det bare Barn
, og dets barn, som vet at de arver fra Base
.privat
, er ingen andre enn Barn
klar over arven.Det har å gjøre med hvordan de offentlige medlemmene av basisklassen eksponeres fra den avledede klassen.
Som litb påpeker, er offentlig arv tradisjonell arv som du vil se i de fleste programmeringsspråk. Det er det modellerer et " IS-A " forhold. Privat arv, noe AFAIK særegent for C++, er et " IMPLEMENTERT I TERMER AV " forhold. Det vil si at du vil bruke det offentlige grensesnittet i den avledede klassen, men ikke vil at brukeren av den avledede klassen skal ha tilgang til det grensesnittet. Mange hevder at i dette tilfellet bør du aggregere basisklassen, det vil si i stedet for å ha basisklassen som en privat base, lage et medlem av avledet for å gjenbruke basisklassens funksjonalitet.
Det er i hovedsak tilgangsbeskyttelse av offentlige og beskyttede medlemmer av basisklassen i den avledede klassen. Med offentlig arv kan den avledede klassen se offentlige og beskyttede medlemmer av basen. Med privat arv kan den ikke det. Med beskyttet kan den avledede klassen og eventuelle klasser avledet fra den se dem.