Virtuele erfenis is een C++-mechanisme voor het maken van een basisklasse die veilig van meerdere keren kan worden overgenomen, zonder problemen met object-slicing of runtime-fouten te veroorzaken.
Beschouw het volgende voorbeeld:
```c++
// Basisklasse
klasse Dier {
publiek:
tekenreeksnaam;
};
// Afgeleide klasse 1
klasse Hond:openbaar dier {
publiek:
string ras;
};
// Afgeleide klasse 2
klasse Kat:openbaar dier {
publiek:
kleur van de string;
};
// Afgeleide klasse 3 (erft van zowel hond als kat)
klasse Huisdier:openbare hond, openbare kat {
publiek:
// ...
};
```
Zonder virtuele overerving zou de klasse 'Pet' twee exemplaren van de basisklasse 'Animal' erven, wat zou kunnen leiden tot runtimefouten of object-slicing (waarbij slechts een deel van het object 'Pet' wordt geconstrueerd). Om dit te voorkomen kunnen we virtuele overerving gebruiken door het trefwoord `virtual` op te geven in de basisklassedeclaratie:
```c++
// Basisklasse met virtuele overerving
klasse Dier {
publiek:
tekenreeksnaam;
};
```
Door gebruik te maken van virtuele overerving zal de klasse `Pet` slechts één kopie van de basisklasse `Animal` erven, waardoor correct gedrag wordt gegarandeerd en runtimefouten worden voorkomen.
Voordelen:
1. Onduidelijkheid oplossen: Helpt bij het oplossen van dubbelzinnigheid wanneer meerdere basisklassen dezelfde lidfunctie of hetzelfde gegevenslid hebben.
2. Verminderde geheugenoverhead: Voorkomt het segmenteren van objecten, vermindert de geheugenoverhead en verbetert de prestaties.
3. Flexibiliteit: Maakt complexe overervingshiërarchieën mogelijk waarbij afgeleide klassen kunnen erven van meerdere basisklassen.
Wanneer virtuele overerving gebruiken:
- Wanneer u meerdere overervingen heeft en dubbelzinnige basisleden of object-slicing wilt vermijden.
- Wanneer u gemeenschappelijke functionaliteit wilt delen over meerdere afgeleide klassen zonder code te dupliceren. |