Reglerna för virtuell funktion?

Svar
En virtuell funktion måste deklareras som en icke-statisk medlem metod av en klass som du förväntar dig att agera som en basklass. Att förklara en virtuell funktion lägger till några omkostnader till följd av att skapa v-tabellen (virtuell metod tabell), men de flesta av den overhead betalas med funktionen första virtuella (efterföljande virtuella funktioner bara lägga till en ny post i redan befintliga v-tabellen). Dock inte deklarera en virtuell funktion om inte du förväntar dig att funktionen ska åsidosättas. Komma ihåg att åsidosätta en överbelastad, icke-virtuell funktion "döljer" alla överbelastning i basklassen.

Om en virtuell funktion måste åsidosättas, förklara det som ren-virtual i stället. Du behöver inte genomföra metoden i basklassen, men du kommer att bli påmind om att ge en implementering i härledda klassen vid kompileringen om det inte finns, även om du tillhandahåller en standard genomförandet i basklassen. Komma ihåg att basera klasser med en eller mer ren-virtuella metoder bli abstrakt - de kan inte instantieras.

Om det finns någon virtuell funktion eller ren-virtuell funktion, måste det också finnas en virtuella destructor, samt en offentlig eller skyddade standardkonstruktör (en konstruktor utan argument). När en härledd klass är konstruerat, anropas basklasskonstruktor, som appeller dess basklasskonstruktor. Härledda klasser är konstruerade i sekvens, börjar med den minst-härledd klassen. Förstörelsen är motsatsen - den mesta-härledd klassen som förstörs innan basklasser förstörs.

Virtuella funktioner kan anropas precis som någon annan klass medlem metod, både via en objektreferens medlem (.), och falskhet (-->) för tips på objekt. Det spelar ingen roll om det referensnummer eller pekaren refererar till en basklass eller en härledd klass; v-tabellen beslutar vilken omställning (där det finns någon) kommer att faktiskt utföra, start från de flesta-derived åsidosättningen och arbeta tillbaka mot basklassen, minst-derived. Med lämplig användning av virtuella funktioner, dynamisk gjutning kan undvikas helt (dynamisk gjutning bör aldrig användas som den helt nederlagen punkt om har en v-tabell i första hand).

Svaret 1. virtuella funktionen bör vara medlem av någon klass 2. de kan inte vara en statisk medlem
3. de hämtas med hjälp av objektet pekare