Dále studujeme rozdíl mezi přetížením a přepsáním pomocí srovnávací tabulky.
Tabulka porovnání:
Základ pro porovnání | Přetížení | Přepsat |
---|---|---|
Prototyp | Prototyp se liší, protože počet nebo typ parametru se může lišit. | Všechny aspekty prototypu musí být stejné. |
Klíčové slovo | Bě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 „virtuální“ v základní třídě. |
Rozlišovací faktor | Číslo nebo typ parametru se liší, což určuje volanou verzi funkce. | Která funkce třídy je volána ukazatelem, je určena adresou objektu, který je tomuto ukazateli přiřazen. |
Definování vzoru | Funkce je předefinována 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 s klíčovým slovem out. |
Čas úspěchu | Čas kompilace. | Doba běhu. |
Konstruktor / virtuální funkce | Konstruktory mohou být přetíženy. | Virtuální funkce může být přepsána. |
Destruktor | Destruktor nelze přetížit. | Destruktor může být přepsán. |
Vazba | Přetížení dosahuje včasné vazby. | Převažující se týká pozdní vazby. |
Definice přetížení
Polymorfismus kompilačního času se nazývá „přetížení“. Protože přetížení je generováno z konceptu polymorfismu, poskytuje „společné rozhraní pro více metod“. To znamená, že pokud je funkce přetížena, obsahuje stejný název funkce, když je předefinována.
Přetížené funkce se liší, pokud jde o, různé 'číslo nebo typ parametru (s), činí jednu přetíženou funkci odlišnou od druhé. Tímto způsobem kompilátor rozpozná, která funkce přetížení je volána. Nejčastěji jsou přetížené funkce „konstruktéři“. „Konstruktor 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) {// první funkce load () a = x; návrat a; } int load (int x, int y) {// druhá funkce load () a = x; b = y; návrat a * b; }}; int main () {přetížení O1; O1.load (20); // první funkce load () zavolá O1.load (20, 40); // druhé volání funkce () funkce}
Zde byla přetížena funkce load () přetížení třídy. Dvě funkce přetížení třídy lze rozlišit způsobem, že první funkce load () přijímá pouze jeden celočíselný parametr, zatímco druhá funkce load () přijímá dva parametry integer. Když objekt přetížení třídy volá funkci load () s jedním parametrem, vyvolá se první funkce load (). Když zavolá objekt funkci load () předávající dva parametry, zavolá se druhá funkce load ().
Definice převažující
Polymorfismus dosažený během run-time se nazývá „overriding“. Toho je dosaženo pomocí 'dědictví' a 'virtuální funkce'. Funkce, která má být přepsána, předchází klíčové slovo „virtuální“ v základní třídě a předefinováno v odvozené třídě bez jakéhokoli klíčového slova.
Jednou z nejdůležitějších věcí, kterou je třeba si pamatovat v případě přepsání, je to, že prototyp přepsané funkce se nesmí měnit, zatímco odvozená třída ji předefinuje. Když je přepsaná funkce dána volání, C ++ určuje, která verze funkce je volána na základě 'typu objektu, na který ukazuje ukazatel', kterým se volání funkce provádí.
Implementace přepsání v C ++
class base {public: virtual void funct () {// virtuální funkce základní třídy cout << "Toto je funct základní třídy ()"; }}; class deriv1: public base {public: void funct () {// virtuální funkce základní třídy redefinovaná v cout1 odvozené třídy1 "Toto je funct třídy class1 ()"; }}; class deriv2: public base {public: void funct () {// virtuální funkce základní třídy nově definovaná v cout co2funct (); // volání funct třídy derivace1). * p = & d2; p-> funct (); // volání funct třídy odvodené2). 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 'virtual' 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'; Třída 'deriv1 ′ vytvoří objekt d1 a třída triedy2 vytvoří objekt d2'.
Zpočátku je adresa ukazatele základní třídy 'b' přiřazena ukazateli základní třídy 'p'. 'p' zavolá funkci funct (), takže je volána funkce základní třídy. Potom je adresa ukazatele 'd1' přiřazena k ukazateli 'p', opět dává volání funct (); zde je vykonána funkce funct () odvozené třídy. Nakonec je ukazatel 'p' přiřazen objektu třídy derived2. Pak 'p' volá funkci funct (), která vykonává funkci func () odvozené2 třídy.
Pokud třída define1 / deriv2 nedefinovala funct (), pak by byla volána funct () základní třídy, protože virtuální funkce jsou „hierarchické“.
Klíčové rozdíly mezi přetížením a přepsáním
- Prototyp funkce, která je přetížena, se liší kvůli typu a počtu parametrů, které jsou předány funkci přetížení. Prototyp přepsané funkce se však nemění, protože přepsaná funkce provádí jinou akci pro jinou třídu, do které patří, ale se stejným typem a číslem parametru.
- Název přetížené funkce nepředchází žádnému klíčovému slovu, zatímco název přepsané funkce předchází klávesové zkratce „Virtuální“ pouze v základní třídě.
- Která funkce přetížení je vyvolána závisí na typu nebo čísle parametru, který je předán funkci. Přepsaná funkce které třídy je vyvolána závisí na tom, která adresa objektu třídy je přiřazena ukazateli, který vyvolával funkci.
- Která funkce přetížení má být vyvolána, je vyřešena během kompilace. Která přepsaná funkce, která má být vyvolána, je během běhu vyřešena.
- Konstruktory mohou být přetíženy, ale nemohou být přepsány.
- Destruktory nemohou být přetíženy, ale mohou být přepsány.
- Přetížení dosahuje včasné vazby, protože přetížená funkce bude vyvolána během kompilace. Překonání dosáhne pozdní vazby, protože ta, která je přepsaná funkce bude vyvolána, je vyřešena během běhu.
Podobnosti
- Oba jsou aplikovány na členské funkce třídy.
- Polymorfismus je základním konceptem obou.
- Název funkce zůstává stejný, zatímco používáme přetížení a přepsání funkcí.
Závěr
Přetížení a přepsání vypadá podobně, ale není tomu tak. Funkce mohou být přetíženy, ale žádná třída nemůže v budoucnu dále předefinovat přetíženou funkci. Virtuální funkce nemůže být přetížena; mohou být přepsány.