Polymorfismus v C ++ s příkladem

Obsah:

Anonim

Co je polymorfismus v C ++?

V C ++ polymorfismus způsobí, že se členská funkce chová odlišně na základě objektu, který jej volá / vyvolá. Polymorfismus je řecké slovo, které znamená mít mnoho podob. Dochází k tomu, když máte hierarchii tříd souvisejících prostřednictvím dědičnosti.

Předpokládejme například, že máme funkci makeSound (). Když kočka tuto funkci zavolá, vydá zvuk mňoukání. Když kráva vyvolá stejnou funkci, poskytne zvuk mňoukání.

I když máme jednu funkci, chová se za různých okolností odlišně. Funkce má mnoho podob; proto jsme dosáhli polymorfismu.

V tomto výukovém programu C ++ se naučíte:

  • Co je polymorfismus?
  • Druhy polymorfismu
  • Kompilace časového polymorfismu
  • Přetížení funkce
  • Přetížení operátora
  • Runtime polymorfismus
  • Přepsání funkce
  • C ++ virtuální funkce
  • Polymorfismus v době kompilace vs. Polymorfismus za běhu

Druhy polymorfismu

C ++ podporuje dva typy polymorfismu:

  • Polymorfismus v době kompilace a
  • Runtime polymorfismus.

Kompilace časového polymorfismu

Přetížené funkce vyvoláte porovnáním počtu a typu argumentů. Informace jsou k dispozici během kompilace. To znamená, že kompilátor C ++ vybere správnou funkci v době kompilace.

Polymorfismus v době kompilace je dosažen přetížením funkcí a přetížením operátora.

Přetížení funkce

Přetížení funkce nastane, když máme mnoho funkcí s podobnými názvy, ale různými argumenty. Argumenty se mohou lišit z hlediska počtu nebo typu.

Příklad 1:

#include using namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}

Výstup:

Zde je snímek obrazovky s kódem:

Vysvětlení kódu:

  1. Zahrňte soubor záhlaví iostream do našeho kódu. Budeme moci používat jeho funkce.
  2. Zahrňte do našeho kódu standardní obor názvů. Budeme moci používat jeho třídy, aniž bychom jej volali.
  3. Vytvořte funkci s názvem test, který přebírá celočíselný parametr i. {Označuje začátek testu funkční funkce.
  4. Příkaz, který se má provést, pokud je vyvolán / vyvolán výše uvedený test funkce.
  5. Konec těla výše uvedené funkční zkoušky.
  6. Vytvořte funkci s názvem test, která přebírá parametr float f. {Označuje začátek testu funkční funkce.
  7. Příkaz, který se má provést, pokud je vyvolán / vyvolán výše uvedený test funkce.
  8. Konec těla výše uvedeného funkčního testu.
  9. Vytvořte funkci s názvem test, která přebírá znakový parametr ch. {Označuje začátek testu funkční funkce.
  10. Příkaz, který se má provést, pokud je vyvolán / vyvolán výše uvedený test funkce.
  11. Konec těla výše uvedeného funkčního testu.
  12. Zavolejte funkci main (). {Označuje začátek těla funkce.
  13. Zavolejte test funkce a předejte mu 5 jako hodnotu argumentu. To vyvolá testovací funkci, která přijímá celočíselný argument, tj. První testovací funkci.
  14. Zavolejte test funkce a předejte mu 5,5 jako hodnotu argumentu. Tím se vyvolá testovací funkce, která přijímá argument float, tj. Druhou testovací funkci.
  15. Zavolejte test funkce a předejte mu pět jako hodnotu argumentu. To vyvolá testovací funkci, která přijímá znakový argument, tj. Třetí testovací funkci.
  16. Pokud program běží úspěšně, musí vrátit hodnotu.
  17. Konec těla funkce main ().

Máme tři funkce se stejným názvem, ale různými typy argumentů. Dosáhli jsme polymorfismu.

Přetížení operátora

V přetížení operátoru definujeme nový význam pro operátor C ++. Také mění způsob práce operátora. Například můžeme definovat operátor + ke zřetězení dvou řetězců. Známe jej jako operátor sčítání pro přidávání číselných hodnot. Po naší definici, když se umístí mezi celá čísla, přidá je. Když se umístí mezi řetězce, spojí je.

Příklad 2:

#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}

Výstup:

Zde je snímek obrazovky s kódem:

Vysvětlení kódu:

  1. Chcete-li využívat jeho funkce, zahrňte do našeho programu soubor záhlaví iostream.
  2. Zahrňte do našeho programu std namespace, abyste mohli používat jeho třídy, aniž byste jej volali.
  3. Vytvořte třídu s názvem ComplexNum. {Označuje začátek těla třídy.
  4. Použijte modifikátor soukromého přístupu k označení proměnných jako soukromých, což znamená, že k nim lze přistupovat pouze zevnitř třídy.
  5. Definujte dvě celočíselné proměnné, skutečné a více.
  6. Použijte modifikátor veřejného přístupu k označení konstruktoru jako veřejného, ​​což znamená, že bude přístupný i mimo třídu.
  7. Vytvořte konstruktor třídy a inicializujte proměnné.
  8. Inicializujte hodnotu proměnné real.
  9. Inicializujte hodnotu proměnné znovu.
  10. Konec těla konstruktoru.
  11. Musíme přepsat význam operátoru +.
  12. Vytvořte výsledek datového typu typu ComplexNum.
  13. Použijte operátor + se složitými čísly. Tento řádek přidá skutečnou část čísla ke skutečné části jiného čísla.
  14. Použijte operátor + se složitými čísly. Tento řádek přidá imaginární část čísla k imaginární části jiného čísla.
  15. Po úspěšném provedení program vrátí hodnotu výsledku proměnné.
  16. Konec definice nového významu operátoru +, tedy přetížení.
  17. Zavolejte metodu print ().
  18. Po přidání na konzolu vytiskněte nové komplexní číslo.
  19. Konec těla funkce print ().
  20. Konec těla třídy ComplexNum.
  21. Zavolejte funkci main ().
  22. Předejte hodnoty skutečných i složitých částí, které chcete přidat. První část c1 bude přidána k první části c2, tj. 10 + 3. Druhá část c1 bude přidána k druhé části c, tj. 2 + 7.
  23. Proveďte operaci pomocí operátoru přetížení + a výsledek uložte do proměnné c3.
  24. Vytiskněte hodnotu proměnné c3 na konzole.
  25. Konec těla funkce main ().

Runtime polymorfismus

K tomu dochází, když je metoda objektu vyvolána / volána během běhu, nikoli během doby kompilace. Runtime polymorfismus je dosažen přepsáním funkce. Funkce, která má být volána / vyvolána, je vytvořena za běhu.

Přepsání funkce

K přepsání funkce dojde, když je funkci základní třídy dána nová definice v odvozené třídě. V té době můžeme říci, že základní funkce byla přepsána.

Například:

#include using namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}

Výstup:

Zde je snímek obrazovky s kódem:

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, importujte soubor záhlaví iostream do našeho programu.
  2. Zahrňte do našeho programu std namespace, abyste mohli používat jeho třídy, aniž byste jej volali.
  3. Vytvořte třídu s názvem Mammal. {Označuje začátek těla třídy.
  4. Pomocí modifikátoru veřejného přístupu nastavte funkci, kterou se chystáme vytvořit, jako veřejně přístupnou. Bude přístupný mimo tuto třídu.
  5. Vytvořte veřejnou funkci s názvem jíst. {Označuje začátek těla funkce.
  6. Vytiskne příkaz přidaný do funkce cout, když je vyvolána funkce eat ().
  7. Konec těla funkce jíst ().
  8. Konec těla třídy Savec.
  9. Vytvořte třídu s názvem Cow, která zdědí třídu Mammal. Kráva je odvozená třída, zatímco savec je základní třída. {Označuje začátek této třídy.
  10. Pomocí modifikátoru veřejného přístupu označte funkci, kterou se chystáme vytvořit, jako veřejně přístupnou. Bude přístupný mimo tuto třídu.
  11. Přepsat funkci eat (), která byla definována v základní třídě. {Označuje začátek těla funkce.
  12. Příkaz k tisku na konzole při vyvolání této funkce.
  13. Konec těla funkce jíst ().
  14. Konec těla třídy Kráva.
  15. Zavolejte funkci main (). {Označuje začátek těla této funkce.
  16. Vytvořte instanci třídy Cow a pojmenujte ji c.
  17. Zavolejte funkci eat () definovanou ve třídě Cow.
  18. Po úspěšném dokončení musí program vrátit hodnotu.
  19. Konec funkce main ().

C ++ virtuální funkce

Virtuální funkce je další způsob implementace běhového polymorfismu v C ++. Je to speciální funkce definovaná v základní třídě a předefinovaná v odvozené třídě. Chcete-li deklarovat virtuální funkci, měli byste použít virtuální klíčové slovo. Klíčové slovo by mělo předcházet deklaraci funkce v základní třídě.

Pokud je třída virtuální funkce zděděna, virtuální třída předefinuje virtuální funkci tak, aby vyhovovala jejím potřebám. Například:

#include using namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}

Výstup:

Zde je snímek obrazovky s kódem:

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, zahrňte do kódu soubor záhlaví iostream.
  2. Zahrňte do našeho kódu std namespace, abyste mohli používat jeho třídy, aniž byste jej volali.
  3. Vytvořte třídu s názvem ClassA.
  4. Pomocí modifikátoru veřejného přístupu označte člena třídy jako veřejně přístupného.
  5. Vytvořte virtuální funkci s názvem show (). Bude to veřejná funkce.
  6. Text, který se má vytisknout, když je vyvolána show (). Endl je klíčové slovo C ++, což znamená koncový řádek. Přesune kurzor myši na další řádek.
  7. Konec těla virtuální funkce show ().
  8. Konec těla třídy ClassA.
  9. Vytvoření nové třídy s názvem ClassB, která dědí třídu ClassA. ClassA se stane základní třídou, zatímco ClassB se stane odvozenou třídou.
  10. Pomocí modifikátoru veřejného přístupu označte člena třídy jako veřejně přístupného.
  11. Předefinujte virtuální funkci show () odvozenou v základní třídě.
  12. Text, který se má vytisknout na konzole při vyvolání funkce show () definované v odvozené třídě.
  13. Konec těla funkce show ().
  14. Konec těla odvozené třídy ClassB.
  15. Zavolejte funkci main (). Logika programu by měla být přidána do jeho těla.
  16. Vytvořte proměnnou ukazatele s názvem a. Ukazuje na třídu s názvem ClassA.
  17. Vytvořte instanci třídy s názvem ClassB. Instance dostala jméno b.
  18. Přiřaďte hodnoty hodnot na adresu b v proměnné a.
  19. Vyvolejte funkci show () definovanou v odvozené třídě. Pozdní vazba byla implementována.
  20. Konec těla funkce main ().

Polymorfismus v době kompilace vs. Polymorfismus za běhu

Zde jsou hlavní rozdíly mezi těmito dvěma:

Polymorfismus v době kompilace Polymorfismus za běhu
Říká se tomu také časná vazba nebo statický polymorfismus Říká se tomu také pozdní / dynamická vazba nebo dynamický polymorfismus
Metoda je volána / vyvolána během doby kompilace Metoda je volána / vyvolána během běhu
Implementováno přes přetížení funkce a přetížení operátora Implementováno prostřednictvím přepsání metody a virtuálních funkcí
Příklad přetížení metody. Mnoho metod může mít podobné názvy, ale různý počet nebo typy argumentů Příklad přepsání metody. Mnoho metod může mít podobný název a stejný prototyp.
Rychlejší provedení, protože zjišťování metod se provádí během kompilace Pomalejší provádění, protože objevitel metody se provádí za běhu.
Poskytuje se menší flexibilita pro řešení problémů, protože vše je známo během kompilace. Při řešení složitých problémů je poskytována velká flexibilita, protože metody jsou objeveny za běhu.

Souhrn:

  • Polymorfismus znamená mít mnoho forem.
  • Dochází k němu, když existuje hierarchie tříd souvisejících prostřednictvím dědičnosti.
  • S polymorfismem se funkce může chovat odlišně na základě objektu, který ji vyvolá / volá.
  • V polymorfismu v době kompilace je funkce, která má být vyvolána, vytvořena během doby kompilace.
  • V běhovém polymorfismu je funkce, která má být vyvolána, vytvořena během běhu.
  • Polymorfismus v době kompilace je určen pomocí přetížení funkce a přetížení operátora.
  • V přetížení funkcí existuje mnoho funkcí s podobnými názvy, ale různými argumenty.
  • Parametry se mohou lišit v počtu nebo typu.
  • V přetížení operátoru je pro operátory C ++ definován nový význam.
  • Runtime polymorfismus je dosažen přepsáním funkce.
  • Ve funkci přepsání dává odvozená třída novou definici funkci definované v základní třídě.