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 hjälp av 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 definieras - eller åsidosätts, beroende på om funktionen definierades i superklassen.
Den virtuella funktionen kan definieras på ett av två sätt. Först kan den 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 Superclass's rubrikfilen.
Det finns fördelar och nackdelar med båda metoderna. Att definiera en funktion som en stubb säkerställer att alla underklasser harhar en viss implementering av det, även om det inte gör någonting. 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 föremål för samma arvregler som icke-virtuella funktioner, så arvshierarkier med mer än två nivåer kanske inte kräver uttryckliga definitioner av virtuella funktioner. For example, one can consider a class A that declares a virtual function, which is implemented in subclass B. Class B has a subclass of its own, class C. Class C does not require an explicit definition of class A's function, because it inherits the definition from class B. If necessary, class C could override class B's function,Eller så kan det åsidosätta klass B: s 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.
klasser B genom G måste alla ha klass A: s virtuella funktion definierat på något sätt. Om klass B har en implementering av A: s funktion, behöver klasserna D och E inte omarbetas. Kanske C: s underklasser måste implementera A: s 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 på rätt sätt kan de minska kodduplicering 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.