Virtuell arv er en C++-mekanisme for å lage en basisklasse som trygt kan arves fra flere ganger, uten å forårsake problemer med objektskjæring eller kjøretidsfeil.
Tenk på følgende eksempel:
```c++
// Grunnklasse
klasse dyr {
offentlig:
strengnavn;
};
// Avledet klasse 1
klasse Hund:offentlig dyr {
offentlig:
string rase;
};
// Avledet klasse 2
klasse Katt:offentlig dyr {
offentlig:
streng farge;
};
// Avledet klasse 3 (arver fra både hund og katt)
klasse kjæledyr :offentlig hund, offentlig katt {
offentlig:
// ...
};
```
Uten virtuell arv, ville `Pet`-klassen arve to kopier av `Animal`-basisklassen, noe som kan føre til kjøretidsfeil eller objektskjæring (der bare en del av `Pet`-objektet er konstruert). For å forhindre dette kan vi bruke virtuell arv ved å spesifisere nøkkelordet "virtuell" i basisklasseerklæringen:
```c++
// Grunnklasse med virtuell arv
klasse dyr {
offentlig:
strengnavn;
};
```
Ved å bruke virtuell arv, vil `Pet`-klassen bare arve én kopi av `Animal`-basisklassen, noe som sikrer korrekt oppførsel og forhindrer kjøretidsfeil.
Fordeler:
1. Løse tvetydighet: Hjelper med å løse tvetydighet når flere basisklasser har samme medlemsfunksjon eller datamedlem.
2. Redusert minneoverhead: Unngår oppskjæring av objekter, reduserer minnekostnader og forbedrer ytelsen.
3. Fleksibilitet: Tillater komplekse arvehierarkier der avledede klasser kan arve fra flere basisklasser.
Når skal du bruke virtuell arv:
- Når du har multippel arv og ønsker å unngå tvetydige basismedlemmer eller objektskjæring.
- Når du vil dele felles funksjonalitet på tvers av flere avledede klasser uten å duplisere kode.