In olio-ohjelmointi , joka on virtuaalinen funktio on funktio määritelty luokka (menetelmä), joka on tarkoitettu uudelleen luokissa, joissa oli perivät sen. Useimmilla kielillä joko kaikki menetelmät ovat automaattisesti virtuaalisia (Java, Swift ...), tai avainsanaa virtualkäytetään osoittamaan, että luokan menetelmä on virtuaalinen (C ++, Delphi , Free Pascal ...).
Funktion, jolla on vain yksi ilmoitus, ilman toteutettua koodia, sanotaan olevan abstrakti tai puhdas virtuaalinen .
Puhtaat virtuaalimenetelmät on tarkoitus määritellä johdetuissa luokissa.
Delfoi
type { ----------------------------------- } { Classe TForme. } { ----------------------------------- } TForme = class public function aire():integer; virtual; end; { ----------------------------------- } { Classe TTriangle dérivée de TForme. } { ----------------------------------- } TTriangle = class(TForme) public function aire():integer; virtual; end; { ----------------------------------- } { Classe TCercle dérivée de TForme. } { ----------------------------------- } TCercle = class(TForme) public function aire():integer; virtual; end;C ++
//--------------------------------------------------------------------------- // Classe Forme. //--------------------------------------------------------------------------- class Forme { public: // La méthode est virtuelle pure. virtual unsigned int aire() = 0; }; //--------------------------------------------------------------------------- // Classe Triangle dérivée de Forme. //--------------------------------------------------------------------------- class Triangle : public Forme { public: virtual unsigned int aire(); }; //--------------------------------------------------------------------------- // Classe Cercle dérivée de Forme. //--------------------------------------------------------------------------- class Cercle : public Forme { public: virtual unsigned int aire(); };Java
/** * Classe Forme. **/ public abstract class Forme { /** * La méthode est virtuelle pure. **/ public abstract int aire(); }; /** * Classe Triangle dérivée de Forme. **/ public class Triangle extends Forme { /** * Implémentation de la méthode. **/ @Override public int aire() { return ...; // calcul de l'aire à partir des champs définis } }; /** * Classe Cercle dérivée de Forme. **/ public class Cercle extends Forme { /** * Implémentation de la méthode. **/ @Override public int aire() { return ...; // calcul de l'aire à partir des champs définis } };Kukin johdettu luokka määrittelee alueen () menetelmän uudelleen. Itse asiassa tapa laskea muodon pinta-ala riippuu tämän muodosta.
Riittää, että luokassa on puhdas virtuaalinen menetelmä, jotta sen voidaan sanoa olevan abstrakti .
Abstraktia luokkaa ei voi luoda heti, koska sillä ei olisi järkeä. Esimerkiksi: voimme instansoida "kolmion" objektin, joka periytyy abstraktista perusluokasta "geometrinen muoto", mutta emme voi luoda "geometrisen muodon" objektia, joka on liian yleinen.
Jotkut kielet vaativat (Swift, C #, ..) tai neuvoo (Java, ...) sijoittamaan avainsanan osoittamaan, että menetelmä määrittelee uudelleen (ohittaa) virtuaalisen ylätavan. Tämä dokumentoi koodin (menetelmä ylikuormittaa vanhemman virtuaalimenetelmän) ja antaa kääntäjän tarkistaa, että tämä on menetelmän kirjoittajan toive.
Tämä on erityisen mielenkiintoista käytettäessä ulkoista kirjastoa.
Toistaiseksi mitään erityistä.
Ja jos ohjelma käännetään uudelleen kirjaston kanssa versiossa 2, on hyvät mahdollisuudet, että se ei enää toimi oikein. Koska D: n m2-menetelmä määrittelee uudelleen C: n m2-menetelmän ja olisi erittäin yllättävää, jos sillä on identtinen koodi.
Jos asetetaan ylikuormitusavainsana, ohjelma ei enää käänny, koska kääntäjä huomaa, että D: n m2-menetelmä ylikuormittaa C: n m2-menetelmää sanomatta niin nimenomaisesti. Tietokonetieteilijä havaitsee virheen kokoamisen aikana ja voi korjata ohjelmansa: