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.

Riešenie

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;
};
  • Všetko, čo pozná Base, pozná aj to, že Base obsahuje publicMember.
  • Iba deti (a ich deti) vedia, že Base obsahuje protectedMember.
  • Nikto okrem Base nevie o privateMember.

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 triedu Child, ktorá dedí od triedy Base.

  • Ak je dedičnosť verejná, všetko, čo vie o Base a Child, vie aj o tom, že Child dedí od Base.
  • Ak je dedičnosť chránená, iba Dieťa a jeho deti vedia, že dedia od Bázy.
  • Ak je dedičnosť súkromná, nikto iný ako Child o dedičnosti nevie.
Komentáre (12)

Súvisí to s tým, ako sú verejné členy základnej triedy vystavené z odvodenej triedy.

  • public -> verejné členy základnej triedy budú verejné (zvyčajne predvolené)
  • protected -> verejné členy bázovej triedy'budú chránené
  • private -> verejné členy základnej triedy'budú súkromné

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'.

Komentáre (2)

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é.

Komentáre (0)