Atšķirība starp funkciju pārslodzi un pārspīlēšanu C ++

Autors: Laura McKinney
Radīšanas Datums: 1 Aprīlis 2021
Atjaunināšanas Datums: 11 Maijs 2024
Anonim
The Great Gildersleeve: Gildy Considers Marriage / Picnic with the Thompsons / House Guest Hooker
Video: The Great Gildersleeve: Gildy Considers Marriage / Picnic with the Thompsons / House Guest Hooker

Saturs


Sadaļā “pārslodze'Mēs no jauna definējam pārslogotās funkcijas ar to pašu funkcijas nosaukumu, bet ar atšķirīgu parametru skaitu un veidu. Sadaļā “pārsvarā“Pārsniegtās funkcijas prototips ir vienāds visā programmā, bet pirms pārslēdzamās funkcijas pamatklasē ir atslēgas vārds“ virtuāls ”, un atvasinātā klase to definē bez atslēgvārda.

Polimorfisms ir viena no OOP būtiskajām iezīmēm. Tas vienkārši nozīmē “viena nosaukuma izmantošanu vairākām veidlapām”. Polimorfismu var īstenot, izmantojot “funkciju pārslodzi”, “operatora pārslodzi” un “virtuālo funkciju”. Gan “pārslodze”, gan “pārsvars” nozīmē polimorfisma jēdzienu. Šeit “pārslodze” ir laika polimorfisms un “svarīgākais” ir laika polimorfisms. Pētot tālāk, ja mēs runājam par būtiskajām atšķirībām “pārslodzē” un “svarīgākajā”.

Tālāk mēs pētām atšķirību starp pārslodzi un pārsniegšanu, izmantojot salīdzināšanas diagrammu.

  1. Salīdzināšanas tabula
  2. Definīcija
  3. Galvenās atšķirības
  4. Līdzības
  5. Secinājums


Salīdzināšanas tabula:

Salīdzināšanas pamatsPārslodzePārmērīga
PrototipsPrototips atšķiras, jo parametru skaits vai tips var atšķirties.Visiem prototipa aspektiem jābūt vienādiem.
AtslēgvārdsPārslodzes laikā netiek lietots neviens atslēgvārds.Funkcijai, kura ir jāatspēko, bāzes klasē ir atslēgas vārds virtuāls.
Atšķirīgais faktorsAtšķiras parametru skaits vai tips, kas nosaka, ka tiek izsaukta funkcijas versija.Kuras klases funkciju rādītājs izsauc, nosaka, kuras klases objekts šim rādītājam tiek piešķirts.
Nosakot modeliFunkcija tiek atkārtoti definēta ar vienādu nosaukumu, bet atšķirīgu parametra numuru un veidu.Funkcija ir definēta, pirms tās galvenajā klasē ir virtuāls atslēgas vārds, un to atkārtoti nosaka atvasināta klase bez atslēgvārda.
Izpildes laiksSastādīt laiku.Darbības laiks.
Konstruktors / virtuālā funkcijaKonstruktori var būt pārslogoti.Virtuālo funkciju var ignorēt.
Iznīcinātājs
Iznīcinātāju nevar pārslogot.Iznīcinātāju var ignorēt.
SaistošsAr pārslodzi tiek panākta agrīna iesiešana.Pārvarēšana attiecas uz novēlotu iesiešanu.


Pārslodzes definīcija

Sastādītā laika polimorfismu sauc par “pārslodzi”. Tā kā pārslodze rodas no polimorfisma jēdziena, tā nodrošina “kopēju saskarni vairākām metodēm”. Tas nozīmē, ja funkcija ir pārslogota, tajā tiek definēts jauns funkcijas nosaukums.

Pārslogotas funkcijas atšķiras pēc atšķirības 'parametru (-u) skaitā vai tipā', tas padara vienu pārslogotu funkciju atšķirīgu no citas. Tādā veidā kompilators atpazīst, kura funkcija tiek izsaukta pārslogoti. Visbiežāk pārslogotās funkcijas ir “konstruktori”. 'Kopiju konstruktors' ir sava veida 'konstruktora pārslodze'.

Pārslodzes ieviešana C ++

klases pārslodze {int a, b; public: int load (int x) {// pirmā slodze () funkcija a = x; atgriezt a; } int slodze (int x, int y) {// otrā slodze () funkcija a = x; b = y; atgriezt a * b; }}; int main () {pārslodze O1; O1.lodze (20); // pirmās slodzes () funkcijas izsaukums O1.load (20,40); // otrās slodzes () funkcijas izsaukums}

Šeit ir pārslogota klases pārslodzes funkcija (). Divas klases pārslogotās funkcijas var atšķirt tādā veidā, ka pirmās slodzes () funkcija pieņem tikai vienu vesela skaitļa parametru, savukārt otrā slodzes () funkcija pieņem divus vesela skaitļa parametrus. Kad klases pārslodzes objekts izsauc slodzes () funkciju ar vienu parametru, tiek izsaukta pirmā slodzes () funkcija. Kad objekts izsauc slodzes () funkciju, nododot divus parametrus, tiek izsaukta otrā slodzes () funkcija.


Pārvarēšanas definīcija

Polimorfisms, kas tiek sasniegts izpildes laikā, tiek saukts par “svarīgu”. To panāk, izmantojot “mantojumu” un “virtuālās funkcijas”. Pārsteidzošajai funkcijai pirms pamatklases ir atslēgas vārds “virtuāls”, bet atvasinātajā klasē tas tiek definēts bez atslēgvārda.

Viena no vissvarīgākajām lietām, kas jāatceras pārsniegšanas gadījumā, ir tāda, ka ignorētās funkcijas prototips nedrīkst mainīties, kamēr atvasinātā klase to atkārtoti definē. Kad tiek izsaukts ignorētās funkcijas, C ++ nosaka, kura funkcijas versija tiek izsaukta, pamatojoties uz “objekta tipu, uz kuru norāda rādītājs”, ar kuru tiek veikta funkcijas izsaukšana.

Pārvarēšanas ieviešana C ++

klases bāze {public: virtual void funct () {// bāzes klases cout virtuālā funkcija << "Šī ir bāzes klases funct ()"; }}; klases deri1: publiskā bāze {public: void funct () {// bāzes klases virtuālā funkcija, kas atkārtoti definēta deri1 klases klasē << "Šī ir deri1 klase funct ()"; }}; klases deri2: publiskā bāze {public: void funct () {// bāzes klases virtuālā funkcija, kas atkārtoti definēta deri2 klases klasē << "Šī ir deri2 klase funct ()"; }}; int main () {bāze * p, b; atvasināts1 d1; atvasināts2 d2; * p = & b; p-> funct (); // zvans uz bāzes klases funkciju (). * p = & d1; p-> funct (); // zvans uz deri1 klases funkciju (). * p = & d2; p-> funct (); // zvans uz deri2 klases funct (). atgriešanās 0; }

Šeit ir viena pamatklase, kuru publiski manto divas atvasinātās klases. Virtuālā funkcija tiek definēta pamatklasē ar atslēgvārdu “virtuāla”, un to atkārtoti definē abas atvasinātās klases bez atslēgvārda. Galvenā () bāzes klasē tiek izveidots rādītāja mainīgais “p” un objekts “b”; Klase 'atvasināts1' rada objektu d1 un atvasināta2 klase rada objektu d2 '.

Tagad sākotnēji bāzes klases objekta “b” adrese tiek piešķirta pamatklases “p” rādītājam. “P” izsauc funkcijas funkciju (), tāpēc tiek izsaukta pamata klases funkcija.Tad atvasinātās1 klases objekta “d1” adrese tiek piešķirta rādītājam “p”, atkal tas izsauc funkciju (); šeit tiek izpildīta atvasinātās1 klases funkcija funct (). Visbeidzot, rādītājs “p” tiek piešķirts deri2 klases objektam. Tad “p” izsauc funkciju funct (), kas izpilda atvasinātās klases funkcijas funct ().

Ja atvasināta1 / atvasināta2 klase nav definējusi funkciju funct (), tad bāzes klases funkcija () būtu izsaukta, jo virtuālā funkcija ir “hierarhiska”.

  1. Pārslogotās funkcijas prototips ir atšķirīgs parametra veida un skaita dēļ, kas tiek nodoti pārslogotajai funkcijai. No otras puses, pārsniegtās funkcijas prototips nemainās, jo pārsniegtā funkcija veic dažādas darbības dažādām klasēm, kurām tā pieder, bet ar vienu un to pašu parametru tipu un skaitu.
  2. Pārslogotas funkcijas nosaukumam nav neviena atslēgas vārda, turpretim pārsniegtas funkcijas nosaukumam ir tikai atslēgas kods “Virtuāls” tikai bāzes klasē.
  3. Uz kuru pārslogoto funkciju tiek izsaukts, ir atkarīgs no funkcijas parametra veida vai skaita. Pārspīlētā funkcija, uz kuru klase tiek izsaukta, ir atkarīga no tā, kuras klases objekta adrese tiek piešķirta rādītājam, kurš izsauca šo funkciju.
  4. Uz kuru pārslogoto funkciju jāizmanto, tiek atrisināts kompilēšanas laikā. Kurā pārsniegtā funkcija jāizvēlas izpildlaika laikā.
  5. Konstruktori var būt pārslogoti, bet tos nevar apgāzt.
  6. Iznīcinātājus nevar pārslogot, bet tos var pārlaist.
  7. Ar pārslodzi tiek panākta agrīna iesiešana, jo kompilēšanas laikā tiek atrisināta pārslodzes funkcija. Pārvarēšana panāk novēlotu iesiešanu, jo izpildītā laika laikā tiek atrisināta pārsniegtā funkcija.

Līdzības

  1. Abas tiek piemērotas klases biedru funkcijām.
  2. Polimorfisms ir abu to pamatjēdziens.
  3. Funkcijas nosaukums paliek tāds pats, kamēr mēs piemērojam funkcijām pārslodzi un pārsvaru.

Secinājums

Pārslodze un pārspiešana šķiet līdzīga, taču tas tā nav. Funkcijas var būt pārslogotas, taču jebkura klase turpmāk nevar pārskatīt pārslogotās funkcijas. Virtuālo funkciju nevar pārslogot; tos var tikai ignorēt.