logo

C++ виртуална функция

  • Виртуалната функция на C++ е функция-член в базовия клас, която предефинирате в производен клас. Декларира се с помощта на ключовата дума virtual.
  • Използва се, за да каже на компилатора да извърши динамично свързване или късно свързване на функцията.
  • Необходимо е да се използва един единствен указател за препратка към всички обекти от различните класове. И така, създаваме указател към базовия клас, който се отнася до всички производни обекти. Но когато указателят на базовия клас съдържа адреса на обекта на производния клас, винаги изпълнява функцията на базовия клас. Този проблем може да бъде разрешен само чрез използване на функцията „виртуална“.
  • „Виртуален“ е ключова дума, предхождаща нормалната декларация на функция.
  • Когато функцията е направена виртуална, C++ определя коя функция да бъде извикана по време на изпълнение въз основа на типа на обекта, посочен от указателя на базовия клас.

Късно свързване или динамично свързване

При късно обвързване извикването на функцията се разрешава по време на изпълнение. Следователно компилаторът определя типа на обекта по време на изпълнение и след това обвързва извикването на функцията.


Правила на виртуалната функция

символ за избягване на java
  • Виртуалните функции трябва да са членове на някакъв клас.
  • Виртуалните функции не могат да бъдат статични членове.
  • Те са достъпни чрез обектни указатели.
  • Те могат да бъдат приятел от друг клас.
  • Виртуална функция трябва да бъде дефинирана в базовия клас, дори и да не се използва.
  • Прототипите на виртуална функция на базовия клас и всички производни класове трябва да бъдат идентични. Ако двете функции с едно и също име, но различни прототипи, C++ ще ги счита за претоварени функции.
  • Не можем да имаме виртуален конструктор, но можем да имаме виртуален деструктор
  • Помислете за ситуацията, когато не използваме ключовата дума virtual.
 #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;>

Изход:

 Value of x is : 5 

В горния пример * a е указателят на базовия клас. Указателят има достъп само до членовете на базовия клас, но не и до членовете на производния клас. Въпреки че C++ позволява на базовия указател да сочи към всеки обект, получен от базовия клас, той не може да има директен достъп до членовете на извлечения клас. Следователно има нужда от виртуална функция, която позволява на базовия указател да осъществява достъп до членовете на производния клас.

Пример за виртуална функция на C++

Нека видим простия пример за C++ виртуална функция, използвана за извикване на производния клас в програма.

 #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;>

Изход:

 Derived Class is invoked 

Чиста виртуална функция

  • Виртуална функция не се използва за изпълнение на каквато и да е задача. Той служи само като заместител.
  • Когато функцията няма дефиниция, такава функция е известна като ' не правя нищо ' функция.
  • ' не правете нищо ' е известна като a чиста виртуална функция . Чиста виртуална функция е функция, декларирана в базовия клас, която няма дефиниция по отношение на базовия клас.
  • Клас, съдържащ чистата виртуална функция, не може да се използва за деклариране на собствените си обекти, такива класове са известни като абстрактни базови класове.
  • Основната цел на базовия клас е да предостави характеристиките на производните класове и да създаде базовия указател, използван за постигане на полиморфизъм по време на изпълнение.

Чистата виртуална функция може да се дефинира като:

 virtual void display() = 0; 

Да видим един прост пример:

преименуване на папка linux
 #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();>

В горния пример базовият клас съдържа чистата виртуална функция. Следователно базовият клас е абстрактен базов клас. Не можем да създадем обекта на базовия клас.