Virtuaalifunktio on superluokassa määritelty funktio, jonka on oltava läsnä alaluokassa, jotta kyseisellä alaluokalla on täydellinen luokan määritelmä. Virtuaalitoiminnot perustuvat olio-ohjelmointiparadigmaan, jota kutsutaan virtuaaliseksi perinnöksi, joka nähdään yleisimmin C ++: ssa käyttämällä “virtuaalista” avainsanaa. Virtuaalitoiminnon määrittämiseksi tarvitaan kaksi luokkaa, superluokka ja alakategoria. Yliluokka on paikka, jossa funktio on ensin ilmoitettu ja mahdollisesti määritelty. Funktio määritellään – tai ohitetaan – alaluokassa sen mukaan, onko toiminto määritelty superluokassa.
Virtuaalitoiminto voidaan määrittää kahdella tavalla. Ensinnäkin se voidaan määritellä tynkäksi, jossa sen runko on tyhjä eikä tee mitään. Toiseksi se voitaisiin määritellä puhtaana virtuaalitoimintona, jossa se määritellään NULL: ksi superluokan otsikkotiedostossa.
Molemmissa menetelmissä on etuja ja haittoja. Funktion määrittäminen tynkäksi varmistaa, että kaikilla alaluokilla on jonkinlainen toteutus siitä, vaikka se ei tekisi mitään. Jos kuitenkin unohdat ohittaa toiminnon ja toteuttaa sen oikein alaluokassa, mitään virheitä tai varoituksia ei kuitenkaan näy. Puhtaan virtuaalifunktion määrittäminen sitä vastoin edellyttää, että jokaisella alaluokalla on oma funktionsa määritelmä, ja virheitä tulee näkyviin, jos näin ei ole.
Virtuaalitoimintoihin sovelletaan kuitenkin samoja perimissääntöjä kuin ei-virtuaalisiin toimintoihin, joten perintähierarkiat, joissa on enemmän kuin kaksi tasoa, eivät ehkä vaadi virtuaalifunktioiden nimenomaisia määritelmiä. Voidaan esimerkiksi harkita luokkaa A, joka ilmoittaa virtuaalitoiminnon, joka on toteutettu alaluokassa B. Luokalla B on oma alaluokka, luokka C. Luokka C ei vaadi nimenomaista määritelmää luokan A toiminnolle, koska se perii Määritelmä luokasta B. Tarvittaessa luokka C voi ohittaa luokan B toiminnon tai se voi ohittaa luokan B toiminnon samalla kun sitä kutsutaan.
Toisaalta virtuaalifunktioita ei tarvitse määritellä alaluokassa, jos ne julistetaan virtuaalisiksi kyseisessä alaluokassa. Voidaan esimerkiksi harkita luokkaa A, joka julistaa virtuaalitoiminnon ja jolla on kaksi alaluokkaa, B ja C. Lisäksi voidaan kuvitella, että luokalla B on alaluokat D ja E ja alaluokalla C alaluokat F ja G.
Kaikilla luokilla B – G on oltava luokan A virtuaalifunktio määritelty jollakin tavalla. Jos luokassa B on toteutettu A: n toiminto, luokkien D ja E ei tarvitse tehdä sitä uudelleen. Ehkä C: n alaluokkien on toteutettava A: n toiminto, mutta molemmat tekevät jotain erilaista, joten funktion määrittäminen luokassa C ei olisi hyödyllistä. Siinä tapauksessa toiminto voidaan julistaa virtuaaliseksi luokassa C, eikä toteutusta tarvita.
Virtuaalitoiminnot voivat olla pelottavia oppia, mutta oikein käytettynä ne voivat vähentää koodin päällekkäisyyttä ja helpottaa koodin ymmärtämistä yleensä. Virtuaalitoiminnoissa on kuitenkin monia sudenkuoppia, erityisesti moninkertaisen perinnön osalta. Moniperinnössä epäselvästi määritellyt virtuaalitoiminnot voivat olla ristiriidassa keskenään, joten niitä tulee käyttää varoen tässä yhteydessä.