virtual inheritance
Főnév
virtual inheritance (tsz. virtual inheritances)
- (informatika) Virtual inheritance (virtuális öröklés) egy C++-specifikus öröklési mechanizmus, amelyet többszörös öröklés esetén használunk annak elkerülésére, hogy az alaposztály többször szerepeljen az öröklési láncban.
🧠 Mi a probléma nélküle?
Tegyük fel, hogy van egy gyökérosztály:
class Animal {
public:
void speak() const { std::cout << "Animal sound\n"; }
};
Két osztály örökli:
class Dog : public Animal {};
class Cat : public Animal {};
És van egy osztály, ami mindkettőt örökli:
class Chimera : public Dog, public Cat {};
🧨 Probléma: A Chimera két példányt fog tartalmazni az Animal osztályból → gyémánt probléma (diamond problem).
💎 Diamond problem
Animal
/ \
Dog Cat
\ /
Chimera
A Chimera most két Animal példányt tartalmaz, tehát ez:
Chimera c;
c.speak(); // ⚠️ Nem fordul le: két speak() van
Fordítási hiba, mert nem tudja eldönteni, melyik útvonalon jutna el az Animal-hoz.
✅ Megoldás: virtual kulcsszó
class Animal {
public:
void speak() const { std::cout << "Animal sound\n"; }
};
class Dog : virtual public Animal {};
class Cat : virtual public Animal {};
class Chimera : public Dog, public Cat {};
Most a Chimera osztály csak egyetlen Animal példányt tartalmaz, amit megoszt a Dog és a Cat.
Most már működik:
Chimera c;
c.speak(); // OK: egyértelmű
🧱 Összefoglalva
| Kulcsszó | Használat |
|---|---|
virtual |
class B : virtual public A |
Ez biztosítja, hogy az A-ból csak egy példány lesz, bármennyi származtatáson keresztül.
🛠 Konstruktorhívásnál
Ha egy virtuális bázisosztály konstruktorparamétert igényel, a legalsó szinten kell meghívni, nem a közbensőkben:
class Animal {
public:
Animal(const std::string& name) { std::cout << name << std::endl; }
};
class Dog : virtual public Animal {
public:
Dog() : Animal("DOG (should be ignored)") {} // NEM ez hívódik meg
};
class Cat : virtual public Animal {
public:
Cat() : Animal("CAT (should be ignored)") {}
};
class Chimera : public Dog, public Cat {
public:
Chimera() : Animal("CHIMERA") {} // 🔥 Ez hívódik meg
};
📦 Használati esetek
- Többszörös öröklés komplex hierarchiákban (pl. több interfész)
- Mixinek, plugin architektúrákban
- Amikor közös őst használunk több ágon keresztül
⚠️ Hátrányok
❌ Bonyolultabb lesz a memórialayout ❌ Bonyolultabb konstruktorlogika ❌ Nehezebb olvasni a kódot, ha túl sokszor van használva
🔚 TL;DR
- Virtual inheritance megakadályozza, hogy többször öröklődjön ugyanaz az ősosztály.
- Használata kötelező a gyémánt probléma elkerüléséhez.
- Konstruktorhívás csak a legalacsonyabb szinten történik.
- virtual inheritance - Szótár.net (en-hu)
- virtual inheritance - Sztaki (en-hu)
- virtual inheritance - Merriam–Webster
- virtual inheritance - Cambridge
- virtual inheritance - WordNet
- virtual inheritance - Яндекс (en-ru)
- virtual inheritance - Google (en-hu)
- virtual inheritance - Wikidata
- virtual inheritance - Wikipédia (angol)