Skip to main content

Vad är en virtuell funktion?

En virtuell funktion är en funktion, definierad i en superklass, som måste finnas i en underklass för den underklassen att ha en komplett klassdefinition.Virtuella funktioner förlitar sig på ett objektorienterat programmeringsparadigm som kallas virtuell arv, som oftast ses i C ++ med det virtuella nyckelordet.För att definiera en virtuell funktion är två klasser nödvändiga, en superklass och en underklass.Superclass är där funktionen först förklaras och eventuellt definieras.Underklassen är där funktionen är definierad mdash;eller åsidosatt, beroende på om funktionen definierades i superklassen.

Den virtuella funktionen kan definieras på ett av två sätt.Först kan det definieras som en stubb, där den har en tom kropp och gör ingenting.För det andra kan det definieras som en ren virtuell funktion, där den definieras som NULL i Superclasss -rubrikfilen.

Det finns fördelar och nackdelar med båda metoderna.Att definiera en funktion som en stubb säkerställer att alla underklasser har en viss implementering av den, även om den inte gör något.Om man glömmer att åsidosätta funktionen och implementera den ordentligt i en underklass, kommer inga fel eller varningar att tyckas påpeka detta.Att definiera en ren virtuell funktion, å andra sidan, kräver att varje underklass har sin egen definition av funktionen, och fel kommer att visas om detta inte är fallet.

Virtuella funktioner är emellertid underkastade samma arvregler som icke-icke-Virtuella funktioner, så arvshierarkier med mer än två nivåer kanske inte kräver uttryckliga definitioner av virtuella funktioner.Till exempel kan man överväga en klass A som förklarar en virtuell funktion, som implementeras i underklass B. Klass B har en egen underklass, klass C. Klass C kräver inte en uttrycklig definition av klass som funktion, eftersom den ärverDefinitionen från klass B. Vid behov kan klass C åsidosätta klass BS -funktion, eller den kan åsidosätta klass BS -funktion samtidigt som den kallar den. Vid de andra extrema behöver virtuella funktioner inte definieras i en underklass om de förklaras virtuella i den underklassen.Till exempel kan man överväga en klass A som förklarar en virtuell funktion och har två underklasser, B och C. Dessutom kan man föreställa sig att klass B har underklasser D och E, och underklass C har underklasser F och G. klasserB Genom G måste alla ha klass som virtuell funktion definierad på något sätt.Om klass B har en implementering av AS -funktionen, behöver klasser D och E inte att göra om.Kanske måste CS -underklasser implementera som funktion, men de båda gör något annorlunda, så att definiera funktionen i klass C själv skulle inte vara användbar.I så fall kan funktionen deklareras virtuell i klass C, och en implementering är inte nödvändig. Virtuella funktioner kan vara skrämmande att lära sig, men när de används korrekt kan de minska koddupliceringen och göra koden mycket lättare att förstå i allmänhet.Det finns många fallgropar med virtuella funktioner, men särskilt när det gäller flera arv.I flera arv är det möjligt för tvetydigt definierade virtuella funktioner att konflikt med varandra, så de bör användas med försiktighet i det sammanhanget.