Virtual vs Abstract
Virtual och Abstract är två nyckelord som används i de flesta objektorienterade (OO) programmeringsspråk som Java och C. Även om det finns små skillnader i vad det betyder på olika språk, ger både virtuella och abstrakta nyckelord en känsla av partiell implementering för de enheter som det är knutet till.
Abstract
Vanligtvis kan abstrakta klasser, även kända som Abstrakta basklasser (ABC), inte instansieras (en instans av den klassen kan inte skapas). Så abstrakta klasser är bara meningsfulla att ha om programmeringsspråket stöder arv (möjlighet att skapa underklasser genom att utöka en klass). Abstrakta klasser representerar vanligtvis ett abstrakt koncept eller entitet med partiell eller ingen implementering. Därför fungerar abstrakta klasser som överordnade klasser som underordnade klasser härleds från, så att den underordnade klassen kommer att dela de ofullständiga funktionerna i den överordnade klassen och funktionalitet kan läggas till för att slutföra dem. Abstrakta klasser kan innehålla abstrakta metoder. Underklasser som utökar en abstrakt klass kan implementera dessa (ärvda) abstrakta metoder. Om barnklassen implementerar alla sådana abstrakta metoder är det en konkret klass. Men om det inte gör det blir barnklassen också en abstrakt klass. Vad allt detta betyder är att när programmeraren nominerar en klass som en abstrakt, säger hon att klassen kommer att vara ofullständig och den kommer att ha element som måste kompletteras av de ärvda underklasserna. Detta är ett trevligt sätt att skapa ett kontrakt mellan två programmerare, vilket förenklar uppgifter inom mjukvaruutveckling. Programmeraren, som skriver kod för att ärva, behöver följa metoddefinitionerna exakt (men kan givetvis ha sin egen implementering). I Java och C deklareras abstrakta klasser och metoder med hjälp av abstrakt nyckelord.
Virtual
Virtuella metoder/funktioner ger möjlighet att valfritt åsidosätta dess beteende av en ärvningsklass (med en funktion med samma signatur). Konceptet med virtuell funktion är viktigt i följande scenario. Anta att en klass härleds av en underklass, så närhelst ett objekt från den härledda klassen används kan det referera till ett objekt i basklassen eller den härledda klassen. Men metodanropsbeteende kan vara tvetydigt om basklassmetoderna åsidosätts. Så, för att lösa denna tvetydighet, används virtuella nyckelord. Om metoden är märkt Virtual, anropas den härledda klassens funktion (om någon) eller så anropas basklassens funktion. Till exempel, i C++, används virtuella nyckelord exakt för detta ändamål. I C används nyckelordet Virtual på liknande sätt, men dessutom bör nyckelordet åsidosätta användas för att modifiera alla åsidosatta metoder. Men i Java finns det inget explicit virtuellt nyckelord. Alla icke-statiska metoder anses vara virtuella. Virtuella funktioner utan kropp kallas rena virtuella funktioner. I Java och C är abstrakta metoder i själva verket Pure Virtual.
Skillnaden mellan virtuell och abstrakt
Även om abstrakt och virtuellt är två nyckelord/koncept som ger en betydelse av ofullständig implementering till dess associerade enheter, har de sina skillnader. Abstrakta metoder (som måste definieras i abstrakta klasser) har ingen implementering alls, medan virtuella metoder kan ha en implementering. Om abstrakta metoder utökas med en konkret klass måste alla ärvda abstrakta metoder implementeras, medan ärvda virtuella metoder kan eller inte kan åsidosättas.