Anonymný používateľ
Viac na
Rozdiel medzi súkromným, verejným a chráneným dedičstvom
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.
947
3
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
aprivate
.Nech:
Base
, pozná aj to, žeBase
obsahujepublicMember
.Base
obsahujeprotectedMember
.Base
nevie oprivateMember
.Pod pojmom "je si vedomý" myslím "potvrdiť existenciu, a teda mať k nemu prístup".
ďalej:
To isté sa deje s verejným, súkromným a chráneným dedením. Uvažujme triedu
Base
a trieduChild
, ktorá dedí od triedyBase
.verejná
, všetko, čo vie oBase
aChild
, vie aj o tom, žeChild
dedí odBase
.chránená
, ibaDieťa
a jeho deti vedia, že dedia odBázy
.súkromná
, nikto iný akoChild
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é.