Virtuel arv er en C++-mekanisme til at skabe en basisklasse, der sikkert kan nedarves fra flere gange uden at forårsage problemer med objektudskæring eller runtime-fejl.
Overvej følgende eksempel:
```c++
// Basisklasse
klasse dyr {
offentlig:
streng navn;
};
// Afledt klasse 1
klasse Hund:offentligt dyr {
offentlig:
string race;
};
// Afledt klasse 2
klasse kat:offentligt dyr {
offentlig:
streng farve;
};
// Afledt klasse 3 (arver fra både hund og kat)
klasse kæledyr:offentlig hund, offentlig kat {
offentlig:
//...
};
```
Uden virtuel nedarvning ville `Pet`-klassen arve to kopier af `Animal`-basisklassen, hvilket kunne føre til runtime-fejl eller objektslicing (hvor kun en del af `Pet`-objektet er konstrueret). For at forhindre dette kan vi bruge virtuel arv ved at angive nøgleordet "virtuel" i basisklasseerklæringen:
```c++
// Basisklasse med virtuel arv
klasse dyr {
offentlig:
streng navn;
};
```
Ved at bruge virtuel arv, vil `Pet`-klassen kun arve én kopi af `Animal`-basisklassen, hvilket sikrer korrekt adfærd og forhindrer runtime-fejl.
Fordele:
1. Løsning af tvetydighed: Hjælper med at løse tvetydighed, når flere basisklasser har den samme medlemsfunktion eller datamedlem.
2. Reduceret hukommelsesomkostninger: Undgår udskæring af objekter, reducerer hukommelsesomkostninger og forbedrer ydeevnen.
3. Fleksibilitet: Giver mulighed for komplekse nedarvningshierarkier, hvor afledte klasser kan arve fra flere basisklasser.
Hvornår skal virtuel arv bruges:
- Når du har flere arv og ønsker at undgå tvetydige basiselementer eller objektudskæring.
- Når du vil dele fælles funktionalitet på tværs af flere afledte klasser uden at duplikere kode.