Mikä on virtuaalinen perintö?

Virtuaalinen perintö on eräänlainen perintö, jossa superluokan toteutus on epätäydellinen ja aliluokka tarvitaan objektin täydelliseen määrittämiseen. Tämän tyyppistä perintöä voidaan käyttää sekä yksittäisen että moninkertaisen perinnön yhteydessä, mutta sitä käytetään yleisimmin useissa perinnöissä. Kaikista luokista, jotka perivät virtuaalisen perusluokan, tulee kyseisen perusluokan suora alaluokka. Virtuaalinen perusluokka voi luottaa aliluokkaan toteuttaakseen kaikki menetelmänsä, mutta tämä ei ole vaatimus.

C ++ on yleisimmin tunnettu tietokonekieli, joka käyttää virtuaalista perintöä. Virtuaalisen perinnön ilmoittamiseen C ++: ssa käytetään “virtuaalista” avainsanaa. Sekä superluokan että alaluokan on ilmoitettava virtuaaliset menetelmät “virtual” -avainsanalla. Tämä kertoo C ++ -kääntäjälle, että superluokka on epätäydellinen, ja sen on saatava tiedot aliluokasta sen suorittamiseksi. Aliluokan käyttäminen superluokan suorittamiseen ei tarkoita sitä, että alaluokat korvaavat toisensa, jos niillä on sama perusluokka.

Koska virtuaalinen perintö edellyttää virtuaalista perusluokkaa, C ++: n globaaleja toimintoja ei voida julistaa virtuaalisiksi. Tätä perintötyyppiä voidaan käyttää vain olio-ohjelmoinnin (OOP) periaatteiden noudattamisessa. Syynä tähän on se, että globaalit toiminnot eivät liity tiettyyn luokkaan ja ovat siten yleensä itsenäisiä. Ilman superluokkaa ja alaluokkaa perintöä ei voi tapahtua, joten globaalit toiminnot ja virtuaalinen perintö sulkevat toisensa pois. Globaaleja toimintoja voidaan teoriassa käyttää virtuaalifunktioiden sisällä, mutta päinvastainen ei välttämättä aina toimi.

Virtuaalista perintöä käytetään ratkaisemaan monia ohjelmointitehtäviä, ja yksi hyödyllisimmistä on epäselvyyksien ratkaiseminen. Moninkertaisessa perinnössä voi olla perusluokka A, jolla on kaksi alaluokkaa B ja C, ja sitten luokka D, joka peri molemmista luokista B ja C. Tätä mallia kutsutaan yleisesti “kuoleman timantiksi”, koska jos luokat A, B- ja C -järjestelmissä on saman menetelmän toteutuksia, luokka D ei voi määrittää, mitä toteutusta sen pitäisi käyttää. Virtuaalinen perintö ratkaisee tämän ongelman, koska kunkin luokan toteutus on edelleen erillinen ja siksi yksiselitteinen. Tätä erottelua käsittelevät erikoistuneet sisäiset objektit, joita kutsutaan virtuaalitaulukoiksi (vtables), jotka seuraavat kutakin objektityyppiä, mutta ohjelmoijan ei tarvitse käsitellä näitä taulukoita nimenomaisesti, koska ne on rakennettu kieleen.