Sobes.tech
Middle

Na aké účely môže byť vo C++ použitá virtuálna dedičnosť?

sobes.tech AI

Odpoveď od AI

Virtuálne dedičstvo v C++ sa používa predovšetkým na riešenie problému "diamantového" dedičstva, keď je základná trieda dedičná viackrát cez niekoľko medziľahlých tried.

Bez virtuálneho dedičstva bude v takom prípade finálny objekt obsahovať niekoľko podobjektov základnej triedy, čo vedie k nejasnostiam a chybám pri prístupe k členom základnej triedy.

S virtuálnym dedičstvom, bez ohľadu na to, koľkokrát sa základná trieda objaví v hierarchii dedičstva, bude v konečnom objekte existovať iba jeden podobjekt základnej triedy.

Príklad:

class Animal { // Základná trieda
public:
    void eat() { /* ... */ }
};

class Mammal : public Animal { // Medzikrok 1
public:
    void walk() { /* ... */ }
};

class Bird : public Animal { // Medzikrok 2
public:
    void fly() { /* ... */ }
};

// Trieda Netopier dedí od Mammal aj od Bird.
// Bez virtuálneho dedičstva bude Animal zahrnutý dvakrát.
// class Bat : public Mammal, public Bird { /* ... */ };

// S virtuálnym dedičstvom bude Animal zahrnutý iba raz.
class Bat : public virtual Mammal, public virtual Bird {
public:
    // Žiadna nejasnosť pri prístupe k eat()
};

Hlavné ciele:

  • Riešenie problému "diamantového" dedičstva: Zabrániť viacerému začleneniu tej istej základnej triedy do finálneho objektu.
  • Zabezpečiť jedinú inštanciu základnej triedy: Zaručiť, že v objekte bude iba jeden podobjekt virtuálne dedenej základnej triedy.
  • Vyhnúť sa nejasnostiam: Odstrániť nejasnosti pri prístupe k členom virtuálne dedenej základnej triedy cez odvodenú triedu.

Virtuálne dedičstvo môže priniesť určité náklady na výkon a zložiť štruktúru objektov, preto jeho použitie by malo byť starostlivo zvážené a odôvodnené.