Skip to main content

Vad är virtuell arv?

Virtuell arv är en typ av arv där implementeringen av en superklass är ofullständig och en underklass krävs för fullständig definition av ett objekt.Denna typ av arv kan användas i samband med både enstaka och multipel arv, men används oftast i flera arv.Varje klass som ärver från en virtuell basklass blir en direkt underklass för den basklassen.En virtuell basklass kan förlita sig på en underklass för att implementera alla dess metoder, men detta är inte ett krav.

C ++ är det mest kända datorspråket för att använda virtuell arv.För att förklara virtuell arv i C ++ används det virtuella nyckelordet.Både superklassen och underklassen måste förklara virtuella metoder med det virtuella nyckelordet.Detta berättar för C ++ -kompilatorn att superklassen är ofullständig och att den måste få information från underklassen för att slutföra den.Att använda underklassen för att slutföra superklassen betyder inte att underklasser skriver över varandra om de har samma basklass, och istället tar C ++ -kompilatorn att bestämma vilka delar som går med varje objekt.

Eftersom en virtuell basklass krävs för virtuellArv, globala funktioner i C ++ kan inte förklaras virtuella.Denna arvtyp kan endast användas när man följer objektorienterade programmering (OOP) principer.Anledningen till detta är att globala funktioner inte är förknippade med en viss klass, och det är vanligtvis fristående på egen hand.Utan en superklass och arv kan inte hända, så globala funktioner och virtuella arv är ömsesidigt exklusiva.Globala funktioner kan i teorin användas i virtuella funktioner, men det omvända kanske inte alltid fungerar.

Virtuell arv används för att lösa många programmeringsproblem, och en av de mest användbara är upplösning av tvetydighet.I flera arv kan man ha en basklass A som har två underklasser, B och C, och sedan en klass D som ärver från båda klasserna B och C. Detta mönster kallas vanligtvis dödens diamant eftersom om klasserna A, B,och C har alla implementeringar av samma metod, det är inte möjligt för klass D att avgöra vilken implementering den ska använda.Virtuell arv löser detta problem eftersom varje klass implementering förblir distinkt och därför entydig.Denna distinktion hanteras av specialiserade interna objekt som kallas virtuella tabeller (Vtables) som håller reda på varje objekttyp, men dessa tabeller behöver inte uttryckligen manipuleras av en programmerare eftersom de är inbyggda i språket.