logo

Virtuální funkce C++

  • Virtuální funkce C++ je členská funkce v základní třídě, kterou předefinujete v odvozené třídě. Deklaruje se pomocí klíčového slova virtual.
  • Používá se k tomu, aby řekl kompilátoru, aby provedl dynamické propojení nebo pozdní vazbu na funkci.
  • Je nutné použít jediný ukazatel k odkazování na všechny objekty různých tříd. Vytvoříme tedy ukazatel na základní třídu, která odkazuje na všechny odvozené objekty. Ale když ukazatel základní třídy obsahuje adresu objektu odvozené třídy, vždy provede funkci základní třídy. Tento problém lze vyřešit pouze pomocí „virtuální“ funkce.
  • 'virtuální' je klíčové slovo předcházející normální deklaraci funkce.
  • Když je funkce virtuální, C++ určí, která funkce má být vyvolána za běhu na základě typu objektu, na který ukazuje ukazatel základní třídy.

Pozdní vazba nebo dynamická vazba

V pozdní vazbě je volání funkce vyřešeno za běhu. Proto kompilátor určí typ objektu za běhu a poté sváže volání funkce.


Pravidla virtuální funkce

java int jako řetězec
  • Virtuální funkce musí být členy nějaké třídy.
  • Virtuální funkce nemohou být statickými členy.
  • Jsou přístupné pomocí ukazatelů na objekty.
  • Mohou být kamarády z jiné třídy.
  • Virtuální funkce musí být definována v základní třídě, i když se nepoužívá.
  • Prototypy virtuální funkce základní třídy a všech odvozených tříd musí být identické. Pokud tyto dvě funkce mají stejný název, ale různé prototypy, C++ je bude považovat za přetížené funkce.
  • Nemůžeme mít virtuální konstruktor, ale můžeme mít virtuální destruktor
  • Zvažte situaci, kdy klíčové slovo virtuální nepoužíváme.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

Výstup:

 Value of x is : 5 

Ve výše uvedeném příkladu je * a ukazatel základní třídy. Ukazatel má přístup pouze k členům základní třídy, ale ne ke členům odvozené třídy. Přestože C++ umožňuje základnímu ukazateli ukazovat na jakýkoli objekt odvozený od základní třídy, nemůže přímo přistupovat k členům odvozené třídy. Proto je potřeba virtuální funkce, která základnímu ukazateli umožňuje přístup k členům odvozené třídy.

Příklad virtuální funkce C++

Podívejme se na jednoduchý příklad virtuální funkce C++ použité k vyvolání odvozené třídy v programu.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

Výstup:

 Derived Class is invoked 

Čistá virtuální funkce

  • Virtuální funkce se nepoužívá k provádění žádné úlohy. Slouží pouze jako zástupný symbol.
  • Když funkce nemá definici, je taková funkce známá jako „ nedělat nic funkce '.
  • ' nedělat nic Funkce je známá jako a čistě virtuální funkce . Čistá virtuální funkce je funkce deklarovaná v základní třídě, která nemá žádnou definici vzhledem k základní třídě.
  • Třídu obsahující čistě virtuální funkci nelze použít k deklaraci vlastních objektů, takové třídy jsou známé jako abstraktní základní třídy.
  • Hlavním cílem základní třídy je poskytnout vlastnosti odvozeným třídám a vytvořit základní ukazatel používaný k dosažení běhového polymorfismu.

Čistá virtuální funkce může být definována jako:

 virtual void display() = 0; 

Podívejme se na jednoduchý příklad:

c# slovník
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

Ve výše uvedeném příkladu obsahuje základní třída čistě virtuální funkci. Proto je základní třída abstraktní základní třídou. Nemůžeme vytvořit objekt základní třídy.