Rozdíl mezi přetížením funkcí a přepsáním v C ++

Autor: Laura McKinney
Datum Vytvoření: 1 Duben 2021
Datum Aktualizace: 11 Smět 2024
Anonim
Rozdíl mezi přetížením funkcí a přepsáním v C ++ - Technologie
Rozdíl mezi přetížením funkcí a přepsáním v C ++ - Technologie

Obsah


V 'přetížení‘Předefinujeme přetížené funkce se stejným názvem funkce, ale s jiným počtem a typem parametrů. V 'převažující‘Prototypu přepsané funkce je v celém programu stejný, ale před přepsanou funkcí předchází klíčové slovo„ virtuální “v základní třídě a předefinovaná odvozená třída je bez jakéhokoli klíčového slova.

Polymorfismus je jednou z klíčových vlastností OOP. Znamená to jednoduše „používat jedno jméno pro více formulářů“. Polymorfismus lze implementovat pomocí „přetížení funkcí“, „přetížení operátorem“ a „virtuální funkce“. Pojem „přetížení“ i „převažující“ znamená koncept polymorfismu. „Přetížení“ je zde polymorfismus kompilace času a „převažující“ polymorfismus běhu. Další studium, pokud mluvíme o hlavním rozdílu v „přetížení“ a „překonání“.


Dále zkoumáme rozdíl mezi přetížením a překonáním pomocí srovnávací tabulky.

  1. Srovnávací tabulka
  2. Definice
  3. Klíčové rozdíly
  4. Podobnosti
  5. Závěr


Srovnávací tabulka:

Základ pro srovnáníPřetíženíPřevažující
PrototypPrototyp se liší, protože počet nebo typ parametru se může lišit.Všechny aspekty prototypu musí být stejné.
Klíčové slovoBěhem přetížení nebylo použito žádné klíčové slovo.Funkci, která má být přepsána, předchází klíčové slovo virtual, v základní třídě.
Rozlišovací faktorPočet nebo typ parametru se liší, což určuje verzi funkce, která se volá.Která funkce třídy je volána ukazatelem, je určena adresou, které je objekt třídy přiřazen k tomuto ukazateli.
Definování vzoruFunkce jsou předefinovány se stejným názvem, ale jiným číslem a typem parametru.Funkce je definována, předchází klíčové slovo virtuální v hlavní třídě a předefinováno odvozenou třídou bez klíčového slova.
Čas dosaženíZkompilovat čas.Doba běhu.
Konstruktor / virtuální funkceKonstruktory mohou být přetíženy.Virtuální funkce lze přepsat.
Destruktor
Destruktor nemůže být přetížen.Destruktor může být přepsán.
VazbaPřetížení dosahuje včasné vazby.Převažující se týká pozdní vazby.


Definice přetížení

Polymorfismus v době kompilace se nazývá „přetížení“. Protože přetížení je generováno konceptem polymorfismu, poskytuje „společné rozhraní pro více metod“. To znamená, že pokud je funkce přetížena, obsahuje při opětovném definování stejný název funkce.

Přetížené funkce se liší, pokud jde o různé „číslo nebo typ parametru“, odlišuje jednu přetíženou funkci od jiné. Tímto způsobem kompilátor rozpozná, která přetížená funkce je volána. Nejčastěji přetížené funkce jsou „konstruktéři“. „Kopírování konstruktoru“ je druh „přetížení konstruktoru“.

Implementace přetížení v C ++

přetížení třídy {int a, b; public: int load (int x) {// funkce first load () a = x; vrátit a; } int load (int x, int y) {// second load () funkce a = x; b = y; návrat a * b; }}; int main () {přetížení O1; O1.load (20); // volání funkce first load () O1.load (20,40); // druhé volání funkce load ()}

Zde byla přetížena funkce load () třídy overload. Obě přetížené funkce třídy lze rozlišit tak, že první funkce load () přijímá pouze jeden celočíselný parametr, zatímco druhá funkce load () akceptuje dva celočíselné parametry. Když objekt třídy přetížení volá funkci load () s jediným parametrem, vyvolá se funkce first load (). Když objekt volá funkci load () předávající dva parametry, zavolá se druhá funkce load ().

Definice převahy

Polymorfismus dosažený za běhu se nazývá „převažující“. Dosahuje se to pomocí „dědičnosti“ a „virtuálních funkcí“. Před přepsanou funkcí předchází klíčové slovo „virtuální“ v základní třídě a předefinované v odvozené třídě bez jakéhokoli klíčového slova.

Jednou z nejdůležitějších věcí, kterou si musíte pamatovat v případě potlačení, je to, že prototyp přepsané funkce se nesmí měnit, zatímco odvozená třída ji znovu definuje. Když je volání přepsáno, C ++ určí, která verze funkce je volána na základě typu objektu označeného ukazatelem, kterým je volání funkce provedeno.

Implementace Overriding v C ++

class base {public: virtual void funct () {// virtuální funkce cout základní třídy << "Toto je základní funkce funct ()"; }}; class deriv1: public base {public: void funct () {// virtuální funkce základní třídy předefinovaná v co1 odvozené třídy1 << "Toto je derived classs funct ()"; }}; class deriv2: public base {public: void funct () {// virtuální funkce základní třídy předefinovaná v co2 odvozené třídy2 << "Toto je odvozená třída funct ()"; "; }}; int main () {base * p, b; odvozeno1 dl; odvozené2d2; * p = & b; p-> funct (); // volání funkce základní třídy (). * p = & d1; p-> funct (); // volání funkce deriv1 class funct (). * p = & d2; p-> funct (); // volání odvozené funkce třídy funct (). návrat 0; }

Zde je jediná základní třída, která je veřejně zděděna dvěma odvozenými třídami. Virtuální funkce je definována v základní třídě s klíčovým slovem „virtuální“ a je definována oběma odvozenými třídami bez klíčového slova. V main () základní třída vytvoří proměnnou ukazatele 'p' a objekt 'b'; 'Odvozená1' třída vytvoří objekt d1 a odvozená třída 2 vytvoří objekt d2 '.

Nyní je původně adresa objektu základní třídy „b“ přiřazena ukazateli základní třídy „p“. "P" vyvolá funkci funct (), takže se nazývá funkce základní třídy.Poté je adresa odvozeného objektu třídy 1 „d1“ přiřazena ukazateli „p“, opět vyvolá funkci funct (); zde se provede funkce funct () odvozené třídy. Nakonec je ukazatelu „p“ přiřazen objekt odvozené třídy 2. Pak 'p' volá funkci funct (), která provede funkci funct () odvozené třídy 2.

Pokud by odvozená třída1 / odvozená2 nedefinovala funct (), pak by byla volána funkce funct () základní třídy, protože virtuální funkce jsou „hierarchické“.

  1. Prototyp funkce, která je přetížena, se liší v důsledku typu a počtu parametrů, které jsou předány přetížené funkci. Na druhé straně se prototyp přepsané funkce nemění, protože přepsaná funkce provádí různé akce pro různé třídy, ke kterým patří, ale se stejným typem a počtem parametrů.
  2. Přetížený název funkce nepředchází žádnému klíčovému slovu, zatímco jméno přepsané funkce předchází pouze keyordu „Virtual“ v základní třídě.
  3. Která přetížená funkce je vyvolána, závisí na typu nebo počtu parametrů, které jsou předány funkci. Přepsaná funkce, na kterou je třída vyvolána, závisí na tom, na kterou adresu třídy objektu je přiřazen ukazatel, který tuto funkci vyvolal.
  4. Která přetížená funkce má být vyvolána, je vyřešena během kompilace. Která potlačená funkce, která má být vyvolána, je vyřešena během běhu.
  5. Konstruktory mohou být přetíženy, ale nelze je přepsat.
  6. Destruktory nemohou být přetíženy, ale mohou být přepsány.
  7. Přetížení dosáhne včasné vazby, protože která přetížená funkce bude vyvolána, je vyřešena během kompilace. Přepsáním se dosáhne pozdní vazby, protože která přepsaná funkce bude vyvolána, je během běhu vyřešena.

Podobnosti

  1. Oba jsou aplikovány na členské funkce třídy.
  2. Polymorfismus je základním konceptem obou.
  3. Název funkce zůstává stejný, zatímco na funkce aplikujeme přetížení a přepisování.

Závěr

Přetížení a převrácení se jeví podobně, ale není tomu tak. Funkce mohou být přetíženy, ale žádná třída nemůže v budoucnu tuto přetíženou funkci dále definovat. Virtuální funkce nemůže být přetížena; mohou být potlačeny.