Middle
Millistel eesmärkidel võib kasutada virtuaalset pärandamist C++-s?
sobes.tech AI
Vastus AI-lt
Võrreldes C++ virtuaalse pärimisega kasutatakse seda peamiselt "rombikujulise" pärimise probleemi lahendamiseks, kui põhiklass pärandatakse mitu korda läbi mitme vaheklass.
Ilma virtuaalse pärimiseta võib lõplikus objektiis sisaldada mitu põhiklassi eksemplari, mis põhjustab ebamäärasust ja vigu põhiklassi liikmetele juurdepääsul.
Virtuaalse pärimise kasutamisel, sõltumata sellest, mitu korda põhiklass ilmub pärimishierarhias, on lõplikus objektiis ainult üks põhiklassi eksemplar.
Näide:
class Animal { // Põhiklass
public:
void eat() { /* ... */ }
};
class Mammal : public Animal { // Vaheklass 1
public:
void walk() { /* ... */ }
};
class Bird : public Animal { // Vaheklass 2
public:
void fly() { /* ... */ }
};
// Bat pärib Mammal ja Bird.
// Ilma virtuaalse pärimiseta, Animal lisatakse kaks korda.
// class Bat : public Mammal, public Bird { /* ... */ };
// Virtuaalse pärimisega, Animal lisatakse ainult üks kord.
class Bat : public virtual Mammal, public virtual Bird {
public:
// Juurdepääs eatele ei ole ebamäärane
};
Peamised eesmärgid:
- "Rombikujulise" pärimise lahendamine: Vältida sama põhiklassi korduvat kaasamist lõplikku objekti.
- Tagada üks eksemplar põhiklassist: Garantii, et objekti sees on ainult üks virtuaalselt pärandatud põhiklass.
- Vältida ebamäärasust: Eemaldada ebamäärasus juurdepääsul virtuaalselt pärandatud põhiklassi liikmetele.
Virtuaalne pärimine võib põhjustada teatud jõudluskulusid ja keerulisemaks muuta objektide struktuuri, seetõttu peaks selle kasutamine olema läbimõeldud ja põhjendatud.