Virtuellt arv är en C++-mekanism för att skapa en basklass som säkert kan ärvas från flera gånger, utan att orsaka problem med objektdelning eller körtidsfel.
Tänk på följande exempel:
```c++
// Basklass
klass Djur {
offentlig:
strängnamn;
};
// Härledd klass 1
klass Hund:offentligt djur {
offentlig:
sträng ras;
};
// Härledd klass 2
klass Katt:offentligt djur {
offentlig:
sträng färg;
};
// Härledd klass 3 (ärver från både hund och katt)
klass Husdjur:offentlig hund, offentlig katt {
offentlig:
// ...
};
```
Utan virtuellt arv skulle "Pet"-klassen ärva två kopior av "Animal"-basklassen, vilket kan leda till körtidsfel eller objektsnitt (där bara en del av "Pet"-objektet är konstruerat). För att förhindra detta kan vi använda virtuellt arv genom att ange nyckelordet "virtuellt" i basklassdeklarationen:
```c++
// Basklass med virtuellt arv
klass Djur {
offentlig:
strängnamn;
};
```
Genom att använda virtuellt arv kommer klassen `Pet` endast att ärva en kopia av basklassen `Animal`, vilket säkerställer korrekt beteende och förhindrar körtidsfel.
Fördelar:
1. Lösa oklarheter: Hjälper till att lösa oklarheter när flera basklasser har samma medlemsfunktion eller datamedlem.
2. Minskad minneskostnad: Undviker skärning av föremål, minskar minneskostnader och förbättrar prestanda.
3. Flexibilitet: Tillåter komplexa arvshierarkier där härledda klasser kan ärva från flera basklasser.
När ska man använda virtuellt arv:
- När du har flera arv och vill undvika tvetydiga baselement eller objektskivning.
- När du vill dela gemensam funktionalitet över flera härledda klasser utan att duplicera kod.