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