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 säger 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 harSamma basklass, och istället tar C ++ -kompilatorn att bestämma vilka bitar som går med varje objekt.
Eftersom en virtuell basklass krävs för virtuell arv kan globala funktioner i C ++ inte deklareras virtuellt. 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 så vanligtvis är 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 ett av de mest användbara är upplösning av tvetydighet. I flera arv kan man ha en basklass A som har två underklasser, B ochC, och sedan en klass D som ärver från båda klasserna B och C. Detta mönster kallas vanligtvis "Diamond of Death" eftersom om klasserna A, B och C alla har implementeringar av samma metod, är det inte möjligt för klass D att bestämma vilken implementering den ska använda. Virtuell arv löser detta problem eftersom varje klass implementering förblir distinkt och därför otvetydigt. 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.