Metoda virtuală - ea

Metoda virtuală (funcția virtuală) - într-o metode de programare orientate-obiect (funcțiile) ale clasei. care poate fi suprascrisă în clasele derivate, astfel încât implementarea specifică a metodei de apel va fi determinată în timpul rulării. Astfel, programatorul nu trebuie să știe tipul exact al obiectului de a lucra cu ei prin metode virtuale: este suficient doar să știu că obiectul aparține unei clase sau subclase, în cazul în care este declarată metoda.

Metode virtuale - una dintre cele mai importante tehnici de a pune în aplicare polimorfism. Acestea vă permit să creați un cod comun, care poate lucra cu ambele obiecte de bază de clasă și obiecte de orice clasă derivată. Atunci când această clasă de bază specifică o metodă de lucru cu obiecte si oricare dintre succesorii săi poate oferi o implementare specifică a acestei metode. In unele limbaje de programare. de exemplu, în Java. nici un concept al unei metode virtuale, acest concept ar trebui să fie utilizat numai pentru limba în care metodele de clasă părinte nu poate fi înlocuită în mod implicit, și numai cu ajutorul unor cuvinte cheie auxiliare. In anumite (cum ar fi în Python), toate metodele - virtuale.

Clasa de bază nu poate asigura punerea în aplicare a unei metode virtuale, ci numai să declare existența. Astfel de metode de punere în aplicare, fără a se numesc (traducerea în limba engleză. Virtuale pure) „virtuale pur“ sau abstracte. Clasa care conține cel puțin o astfel de metodă ar fi prea abstractă. Obiectul acestei clase nu pot fi create (în unele limbi sunt permise, dar rezultatele abstracte metoda de apel într-o eroare). Moștenitorii o clasă abstractă trebuie să asigure o punere în aplicare pentru toate metodele abstracte, sau ei, la rândul lor, vor clase abstracte.

Pentru fiecare clasă, care are cel puțin o metodă virtuală creează o tabelă metodă virtuală. Fiecare obiect stochează un pointer la masa din clasa sa. Pentru metoda de apel virtuale folosit acest mecanism: obiectul este luat de la un pointer la masa metodei virtuale, și de la ea, la un fix de compensare, - un pointer la punerea în aplicare a metodei utilizate pentru clasa. Dacă utilizați moștenire multiplă sau interfețe situație este oarecum complicată datorită faptului că tabelul metoda virtuală devine neliniară.

Funcția virtuală EXEMPLU în C ++

Exemplu de C ++. care ilustrează diferența dintre funcțiile virtuale de la non-virtuale:

În acest exemplu, clasa strămoș definește două funcții, una dintre ele virtuale, celălalt - nr. clasa Descendentul suprascrie ambele funcții. Cu toate acestea, s-ar părea același tratament funcțiile dă rezultate diferite. La ieșirea programului va oferi următoarele:

Aceasta este, în cazul funcțiilor virtuale pentru a determina implementarea funcției utilizează informațiile despre tipul de obiect și se numește punerea în aplicare „corectă“, indiferent de tipul de index. Când apelați o funcție non-virtuale, compilatorul este ghidat de un tip pointer sau referință, așa-numitele două implementări Function2 diferite (). în ciuda faptului că folosit unul și același obiect.

Trebuie remarcat faptul că în C ++, se poate, dacă este necesar, pentru a specifica o implementare particulară a funcției virtuale este, de fapt cauzează lumea ei fizică:

de exemplu nostru va arăta strămoș :: function1 (). ignorând tipul de obiect.

Funcția virtuală EXEMPLU în Delphi

Obiect Limba Pascal. utilizat în Delphi, a pus, de asemenea, susține polimorfism. Luați în considerare acest exemplu:

Declarați două clase. Strămoș (strămoș):

și urmașii lui (descendentul):

După cum se poate observa în strămoșul clasă a declarat funcția virtuală - VirtualProcedure. Pentru a face uz de avantajele polimorfism, este necesar să se taie în copil.

Punerea în aplicare este după cum urmează:

Să vedem cum funcționează:

Rețineți că secțiunea var, am anunțat două obiecte de tip MyObject1 și TAncestor MyObject2. Iar atunci când creați MyObject1 creat ca TAncestor. precum și MyObject2 TDescendant. Aceasta este ceea ce vom vedea când faceți clic pe butonul de BitBtn1:

  1. Strămoș procedură statică.
  2. Strămoș procedură virtuală.
  3. Strămoș procedură statică.
  4. Procedura de suprascriere Descendentul.

Pentru MyObject1 totul este clar, pur și simplu apel aceste proceduri. Dar pentru MyObject2 nu este.

Call MyObject2.StaticProcedure; a condus la apariția unor «proceduri statice strămoș.». După ce am anunțat MyObject2: TAncestor. astfel încât procedura StaticProcedure a fost cauzată; Clasa TAncestor.

Dar MyObject2.VirtualProcedure provocare; VirtualProcedure a condus la apel; implementat în descendentul (TDescendant). Acest lucru sa întâmplat pentru că MyObject2 a fost creat nu ca un TAncestor. ci ca TDescendant. MyObject2: = TDescendant.Create;. Și metoda virtuală VirtualProcdure a fost blocată.

În polimorfismul Delphi este implementat de un așa-numita metodă de masă virtuală (sau VMT).

Destul de des uitați metode virtuale se suprapun cu supracontrolul de cuvinte cheie. Acest lucru conduce la metoda de închidere. În acest caz, metodele de înlocuire în VMT nu se vor produce și se obține funcționalitatea dorită.

Această eroare este monitorizată de compilator, care dă un avertisment.

Apelați metoda strămoș de imperative

Uneori ai nevoie pentru a apela prioritari metoda strămoș.

Declarați două clase. Strămoș (strămoș):

și urmașii lui (descendentul):

Recurs la metoda strămoș este implementată cu cuvântul cheie «moștenit»

Este demn de amintit faptul că, în Delphi destructor, trebuie neapărat să fie suprapus - «suprareglare» - și conțin un stramos apel destructor

În C ++, nu au nevoie pentru a apela constructor si destructor strămoșul, destructor virtuale ar trebui să fie. Strămoși provoca în mod automat destructori. Pentru a apela metoda strămoș, trebuie să invocați în mod explicit metoda:

Pentru a apela un constructor părinte este necesar să se specifice constructorului:

Vezi ce o „metodă virtuală“ în alte dicționare:

Virtual sursă - Acest articol lipsesc referințele bibliografice la sursele de informații. Informațiile trebuie să fie verificabile, în caz contrar acesta poate fi pusă la îndoială și eliminate. Aveți posibilitatea să ... Wikipedia

Metoda Rezumat - Acest articol ar trebui să fie vikifitsirovat. Vă rugăm să-l facă în conformitate cu regulile de baza documentelor de înregistrare. Metoda abstractă (sau metoda virtuală pură (metoda virtuală pură este adesea tradus incorect ca metodă virtuală pură)) în ... Wikipedia

Metoda Factory (model de proiectare) - proiectare fabrică model Metoda Metoda Fabrica de tip: generarea descrisă în Design Patterns Da Metoda de fabrica (Factory Metoda Eng.) Model Creational, care oferă o interfață pentru subclase va construi ... Wikipedia

Metoda Factory - (în engleză Factory Method.) Model Creational, care oferă o interfață pentru crearea unei instanțe ale expirării termenului de amânare clasă. La momentul moștenitorilor poate decide care clasa a instantia. Cu alte cuvinte, fabrica ... ... Wikipedia

Inteligent Virtual Circuit Permanent - stabilirea unei metode de comunicare folosind conexiuni logice hibride create printr-o combinație a celor două tipuri de circuite virtuale permanente (PVC) și comutate (SVC). Administratorul de rețea stabilește conexiunile, dar ... ... Traducator tehnic

Funcția virtuală - metoda virtuală (funcția virtuală) într-un metode orientate obiect de programare (funcții) ale clasei care pot fi suprascrise în clasele de moștenitori, astfel încât o implementare particulară a metodei de a apela va fi determinată în momentul ... ... Wikipedia

Compararea C Sharp și Java - titlul corect al acestui articol Compararea C # și Java. El este prezentat incorect din cauza limitărilor tehnice. Comparație de limbaje de programare comparație generale de sintaxă de bază Instrucțiuni de bază Matricele Asociative matrici tranzacții ... ... Wikipedia

  • Metoda virtuală. Dzhessi Rassel. Această carte va fi făcută în conformitate cu comanda pe tehnologia de imprimare Tehnologie-on-Demand. Conținutul de calitate înaltă prin articole wikipedia! Metoda virtuală (funcția virtuală) - ... Read More Cumpără pentru 1254 de ruble
  • Metoda Factory (model de design). Dzhessi Rassel. Această carte va fi făcută în conformitate cu comanda pe tehnologia de imprimare Tehnologie-on-Demand. Conținutul de calitate înaltă prin articole wikipedia! Metoda Factory (în engleză Factory Method.) - genereaza ... Read More Cumpără pentru 1.125 de ruble
  • Tempo-world. Viteza Perceptual și scara de timp. Alyushin AL Rod pentru această carte este conceptul potrivit căruia fluxul de date de la simturi este procesata in creier, în formă discretă, sub forma cadrului neurofiziologice. Bazat pe ... Citește mai mult Cumpărați 348 ruble
Alte „metoda virtuală“, o carte la cerere >>

articole similare