Jak implementovat virtuální funkci v C ++?



Tento článek vám představí ještě další programovací koncept, kterým je Virtual Function v C ++. Koncept bude podpořen demonstrací.

Virtuální funkce v C ++ je členská funkce v základní třídě, kterou předefinujeme v odvozené třídě. Tento článek vám pomůže podrobně prozkoumat koncept. Následující ukazatele budou popsány v tomto článku,

Pojďme tedy začít s tímto článkem o Virtual Function v C ++





Co je to virtuální funkce?

Virtuální funkce je členská funkce v rámci základní třídy, kterou předefinujeme v odvozené třídě. Deklaruje se pomocí virtuálního klíčového slova. Když se zdědí třída obsahující virtuální funkci, odvozená třída předefinuje virtuální funkci tak, aby vyhovovala jejím vlastním potřebám.

Pokračujeme tímto článkem o virtuální funkci v C ++



Pravidla pro virtuální funkci v C ++:

  • Jsou vždy definovány v základní třídě a přepsány v odvozené třídě, ale není nutné přepsat v odvozené třídě.
  • Virtuální funkce musí být deklarovány ve veřejné části třídy.
  • Nemohou být statické nebo přátelské funkce také nemohou být virtuální funkcí jiné třídy.
  • Virtuální funkce by měly být přístupné pomocí ukazatele, aby se dosáhlo polymorfismu doby běhu.

Pokračujeme tímto článkem o virtuální funkci v C ++.

Co je závazné?

Vazba pro funkce znamená, že kdekoli je volání funkce, kompilátor potřebuje vědět, ke které definici funkce by měla být přiřazena. To závisí na podpisu každé deklarace funkce a přiřazeních, která jsou přijata. Kompilátor také potřebuje vědět, že když dojde ke shodě mezi voláním funkce a výběrem správné definice.

Pokračujeme tímto článkem o virtuální funkci v C ++



Včasná vazba

Včasná vazba je jev, při kterém se rozhodnutí o shodě s různými voláními funkcí děje v samotném čase kompilace a překladač přímo spojuje odkaz s adresami. Je také známá jako statická vazba nebo vazba v době kompilace.

  • Jak víme, píšeme kód v jazyce na vysoké úrovni
  • Potom to kompilátor převede do jazyka nízké úrovně, kterému počítač rozumí, většinou strojového jazyka v době kompilace
  • V časné vazbě kompilátor přímo poskytuje adresu instrukce deklarace funkce instrukci volání funkce
  • Jak tedy název napovídá, k vazbě dochází velmi brzy před spuštěním programu.

Příklad

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // předčasný návrat vazby 0}

Výstup

Výstup - Virtuální funkce v C ++ - Edureka

vysvětlení ion
V tomto příkladu jsme vytvořili ukazatel a na nadřazenou třídu Animals. Poté napsáním a = & c začal ukazatel „a“ odkazovat na objekt c třídy Cats.
a -> sound () - Při volání funkce sound (), která je přítomna v obou třídách pomocí ukazatele 'a', byla volána funkce nadřazené třídy, i když ukazatel odkazuje na objekt třídy Cats .

Důvodem je Early Binding. Víme, že „a“ je ukazatel nadřazené třídy odkazující na objekt podřízené třídy. Protože časná vazba probíhá v době kompilace, takže když kompilátor viděl, že 'a' je ukazatel nadřazené třídy, odpovídalo volání funkcí 'sound ()' nadřazené třídy, aniž by hledal objekt, na který je ukazatel odkazuje na.

Pokračujeme tímto článkem o virtuální funkci v C ++

Pozdní vazba

V pozdní vazbě kompilátor identifikuje objekt za běhu a poté odpovídá volání funkce se správnou funkcí. Je také známý jako Dynamic Binding nebo Runtime Binding.

Pozdní vazbu ve výše uvedeném problému lze vyřešit použitím virtuálního klíčového slova v základní třídě. Podívejme se, jak k tomu dochází, pomocí samotného výše uvedeného příkladu, ale pouze přidáním virtuálního klíčového slova.

co je konstruktor v pythonu

Příklad

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () návrat 0}

Výstup

Vysvětlení
Zde je funkce sound () základní třídy vytvořena virtuální, takže kompilátor nyní provádí pozdní vazbu pro tuto funkci. Nyní bude volání funkce funkce sound () přizpůsobeno definici funkce za běhu. Jelikož kompilátor nyní identifikuje ukazatel „a“ jako odkaz na objekt „c“ odvozené třídy Cats, bude volat funkci sound () třídy Cats.

Pokračujeme tímto článkem o virtuální funkci v C ++

Čistá virtuální funkce

Čistá virtuální funkce v C ++ je virtuální funkce, pro kterou nemáme implementaci, pouze ji deklarujeme. Čistá virtuální funkce je deklarována přiřazením 0 v deklaraci.

zvuk virtuálních prázdnin () = 0

Zde je sound () čistě virtuální funkce.

Pokračujeme tímto článkem o virtuální funkci v C ++

Abstraktní třída

Abstraktní třída je definována jako třída s jednou nebo více čistými virtuálními funkcemi. Jak je vysvětleno výše, čistá virtuální funkce je virtuální členská funkce, která je označena jako bez implementace. S informacemi poskytnutými ve třídě, včetně všech základních tříd, není možná žádná implementace. Abstraktní třída je také známá jako abstraktní základní třída.

Příklad

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int plate public: Employee_1 (int s) {plat = s} int getSalary () {návratový plat}} třída Zaměstnanec_2: veřejný Zaměstnanec {int plat veřejný: Zaměstnanec_2 (int t) {plat = t} int getSalary () {návratný plat}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Výstup

Vysvětlení
Funkce ‚getSalary () 've třídě Zaměstnanec je čistě virtuální funkce. Protože třída Employee obsahuje čistě virtuální funkci, jedná se o abstraktní základní třídu.
Protože čistá virtuální funkce je definována v podtřídách, je tedy funkce ‚getSalary () 'definována v obou podtřídách třídy Employee, tj. V Employee_1 a Employee_2.

Pokračujeme tímto článkem o virtuální funkci v C ++

Příklad pro virtuální funkci

#include using namespace std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

Výstup

Vysvětlení
Pro volání funkce function_1 () se volá verze funkce základní třídy, funkce_2 () je přepsána v odvozené třídě, takže se volá verze odvozené třídy, funkce_3 () není přepsána v odvozené třídě a je virtuální funkcí, takže se volá verze základní třídy, podobně funkce_4 () není přepsána, takže se volá verze základní třídy.

Tak jsme se dostali na konec tohoto článku o „Virtuální funkci v C ++“. Pokud se chcete dozvědět více, podívejte se na Edureka, důvěryhodná online vzdělávací společnost. Školicí a certifikační kurz Edureka Java J2EE a SOA je navržen tak, aby vás vyškolil jak pro základní, tak pro pokročilé koncepty Java spolu s různými rámci Java jako Hibernate & Spring.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto blogu a my se vám ozveme co nejdříve.