Aký je rozdiel medzi dedičnosťou public
, private
a protected
v jazyku C++? Všetky otázky, ktoré som našiel na SO, sa týkajú konkrétnych prípadov.
Aby som mohol odpovedať na túto otázku, chcel by som najprv vlastnými slovami opísať prístupové prvky člena. Ak to už viete, preskočte na nadpis "ďalej:".
Existujú tri accessory, o ktorých viem: public
, protected
a private
.
Nech:
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
Base
, pozná aj to, že Base
obsahuje publicMember
.Base
obsahuje protectedMember
.Base
nevie o privateMember
.Pod pojmom "je si vedomý" myslím "potvrdiť existenciu, a teda mať k nemu prístup".
To isté sa deje s verejným, súkromným a chráneným dedením. Uvažujme triedu Base
a triedu Child
, ktorá dedí od triedy Base
.
verejná
, všetko, čo vie o Base
a Child
, vie aj o tom, že Child
dedí od Base
.chránená
, iba Dieťa
a jeho deti vedia, že dedia od Bázy
.súkromná
, nikto iný ako Child
o dedičnosti nevie.Súvisí to s tým, ako sú verejné členy základnej triedy vystavené z odvodenej triedy.
Ako upozorňuje litb, verejná dedičnosť je tradičná dedičnosť, s ktorou sa'stretnete vo väčšine programovacích jazykov. To znamená, že modeluje vzťah "IS-A". Súkromná dedičnosť, ktorá je AFAIK vlastná jazyku C++, je vzťah "IMPLEMENTOVANÝ V PODMIENKACH". To znamená, že chcete používať verejné rozhranie v odvodenej triede, ale nechcete, aby mal používateľ odvodenej triedy prístup k tomuto rozhraniu. Mnohí tvrdia, že v tomto prípade by ste mali základnú triedu agregovať, to znamená, že namiesto toho, aby základná trieda bola súkromnou základnou triedou, vytvorte z nej člen odvodenej triedy, aby ste mohli opätovne využívať funkčnosť základnej triedy'.
Je to v podstate ochrana prístupu k verejným a chráneným členom základnej triedy v odvodenej triede. Pri verejnej dedičnosti môže odvodená trieda vidieť verejné a chránené členy základnej triedy. Pri súkromnej dedičnosti nie. V prípade protected ich vidí odvodená trieda a všetky triedy z nej odvodené.