Razlika između virtualne i čiste virtualne funkcije

Autor: Laura McKinney
Datum Stvaranja: 2 Travanj 2021
Datum Ažuriranja: 13 Svibanj 2024
Anonim
C++ - Tutorijal 68 - Abstraktne klase i čiste virtualne funkcije
Video: C++ - Tutorijal 68 - Abstraktne klase i čiste virtualne funkcije

Sadržaj


Virtualna i čista virtualna funkcija oboje su pojmovi polimorfizma vremena izvođenja. Glavna razlika između 'virtualna funkcija i "Čista virtualna funkcija" jest da "virtualna funkcija" ima svoju definiciju u osnovnoj klasi, a također je i nasljedne izvedene klase redefiniraju. Čista virtualna funkcija nema definiciju u osnovnoj klasi, a sve nasljedne izvedene klase moraju je redefinirati.

Međutim, virtualna funkcija se također naziva i dinamička dispeč i dispeč. Vremena, a pozvana se funkcija određuje u vremenu izvođenja u skladu s tipom objekta koji se koristi.

Polimorfizam podržava oba jezika C ++ i Java. U Javi se umjesto "virtualne funkcije" upotrebljava izraz "nadjačavanje", jer je virtualna funkcija pojam C ++.

  1. Usporedni grafikon
  2. definicija
  3. Ključne razlike
  4. Zaključak

Usporedni grafikon

Osnove za usporedbuVirtualna funkcijaČista virtualna funkcija
Osnovni, temeljniVirtualna funkcija ima svoju definiciju u osnovnoj klasi.Čista virtualna funkcija nema definiciju u osnovnoj klasi.
Deklaracijavirtualna naziv funkcije (parametar_list) {. , , , .};virtualno ime funkcije (parametar_list) = 0;
Izvedena klasaSve izvedene klase mogu ili ne moraju nadjačati virtualnu funkciju osnovne klase.Sve izvedene klase moraju nadjačati virtualnu funkciju osnovne klase.
Posljedica

Virtualne funkcije su hijerarhijske prirode; ne utječe na sastavljanje ako bilo koja izvedena klasa ne nadjačava virtualnu funkciju osnovne klase.Ako sve izvedene klase ne nadjačaju virtualnu funkciju osnovne klase, pojavit će se pogreška kompilacije.
Sažetak klaseNema koncepta.Ako klasa sadrži najmanje jednu čistu virtualnu funkciju, tada se proglašava apstraktnom.


Definicija virtualne funkcije

virtualna funkcija je članska funkcija osnovne klase, a redefinira je izvedenim klasama koje nasljeđuju osnovnu klasu. Nije nužno da sve naslijeđene izvedene klase moraju redefinirati virtualnu funkciju, već je redefinirane samo one izvedene klase koje mogu zahtijevati njeno funkcioniranje. Virtualna funkcija nastaje deklariranjem funkcije u osnovnoj klasi koja je prethodila ključnoj riječi 'virtualan'.

Izjava:

baza klase {public: virtualni tip funt_name (popis parametara) {. , , }};

Nasljeđivanje izvedenih klasa može redefinirati virtualnu funkciju bez ikakve 'virtualne' ključne riječi. Izvedene klase redefiniraju virtualnu funkciju kako bi ispunile svoj zadatak. Kako je virtualna funkcija redefinirana u izvedenim klasama, imamo više oblika iste funkcije. Sada, koja se inačica funkcije zove, ovisi o tome koji će se objekt pozivati ​​na poziv u tu funkciju.


Višeslojno nasljeđivanje

U višeslojnom nasljeđivanju, gdje izvedena klasa koja je naslijedila virtualnu funkciju od svoje osnovne klase, a kada se sama koristi kao osnovna klasa za drugu izvedenu klasu, virtualnu funkciju još uvijek može nadjačati. Kada se virtualna funkcija naslijedi, baštini se i njena virtualna priroda.

Virtualne funkcije su također hijerarhijske prirode, tj. Ako izvedena klasa ne nadjačava / redefinira virtualnu funkciju nasljeđenu od osnovne klase i kada objekt izvedene klase poziva tu virtualnu funkciju, tada se poziva virtualna funkcija definirana osnovnom klasom.

Definicija čiste virtualne funkcije

Kao što je gore navedeno, ako izvedena klasa ne nadjačava virtualnu funkciju, tada se koristi virtualna funkcija definirana osnovnom klasom. Ali što ako osnovna klasa sama ne definira virtualnu funkciju. Mnogo puta osnovna klasa nema definiciju virtualne funkcije ili ponekad želite da sve izvedene klase moraju nadjačati virtualnu funkciju.

Da bi podnio ove dvije situacije, C ++ podržava koncept „Čista virtualna funkcija„. "Čista virtualna funkcija" deklarirana je u osnovnoj klasi, ali ona nema njenu definiciju u osnovnoj klasi. Čista virtualna funkcija deklarirana je na sljedeći način.

virtualni tip funct_name (parametar_list) = 0;

Kad god se virtualna funkcija u osnovnoj klasi učini "čistom", tada svaka izvedena klasa obvezno nadjačava čistu virtualnu funkciju osnovne klase. Ako izvedena klasa ne uspije nadjačati čistu virtualnu funkciju osnovne klase, rezultirat će greškom u sastavljanju.

Sažetak klase

Klasa koja sadrži najmanje jednu čistu funkciju naziva se "apstraktna klasa". Ne mogu se stvoriti objekti apstraktnih klasa, ali možete stvoriti reference i pokazivače na apstraktne klase. Članovima apstraktnih klasa može se pristupiti kroz objekt izvedenih klasa koji nasljeđuje apstraktnu osnovnu klasu.

Klasa koju želite proglasiti apstraktnom, koristite ključnu riječ 'sažetak' ispred „Klase” ključne riječi.

// na primjer, apstraktna klasa-naziv {. , virtualni tip funct_name (parametar_list) = 0; , , };

  1. Virtualne funkcije definitivno su definirane u osnovnoj klasi i redefinirane (nadjačavaju) u izvedenoj klasi. S druge strane, čista virtualna funkcija osnovna klasa posebno nije definirana u osnovnoj klasi
  2. Izvedena klasa ako je potrebno redefinirati (nadjačati) virtualnu funkciju, dok, u slučaju čiste virtualne funkcije, izvedena klasa mora definitivno redefinirati čistu virtualnu funkciju.
  3. Ako izvedena klasa ne uspije redefinirati (nadjačati) virtualnu funkciju, može koristiti virtualnu funkciju osnovne klase. Suprotno tome, ako izvedena klasa ne uspije nadjačati čistu virtualnu funkciju, tada dolazi do pogreške u sastavljanju.
  4. Bazna klasa koja sadrži virtualnu funkciju može se instancirati, tj. Može se kreirati njen objekt. Nasuprot tome, osnovna klasa koja sadrži čistu virtualnu funkciju, tj. Apstraktna klasa se ne može instancirati jer apstraktna klasa nije u potpunosti definirana.

Bilješka:
Prototip "virtualne funkcije" i "čiste virtualne funkcije" ostaje isti u cijelom programu.

Zaključak:

Obje "virtualne funkcije" i "čista virtualna funkcija" imaju svoju važnost, kao što je i slučaj u "virtualnim funkcijama", sva izvedena klasa ne treba redefinirati virtualnu funkciju i tamo gdje želimo da sva izvedena klasa redefinira virtualnu funkciju, čistu virtualnu tamo se najbolje primjenjuje funkcija.