- Funkcja wirtualna C++ jest funkcją członkowską w klasie bazowej, którą definiuje się ponownie w klasie pochodnej. Deklaruje się go za pomocą słowa kluczowego virtual.
- Służy do poinformowania kompilatora, aby wykonał dynamiczne łączenie lub późne wiązanie funkcji.
- Istnieje konieczność użycia pojedynczego wskaźnika do odwoływania się do wszystkich obiektów różnych klas. Tworzymy zatem wskaźnik do klasy bazowej, który odwołuje się do wszystkich obiektów pochodnych. Ale gdy wskaźnik klasy bazowej zawiera adres obiektu klasy pochodnej, zawsze wykonuje funkcję klasy bazowej. Ten problem można rozwiązać jedynie za pomocą funkcji „wirtualnej”.
- „Wirtualny” to słowo kluczowe poprzedzające normalną deklarację funkcji.
- Kiedy funkcja staje się wirtualna, C++ określa, która funkcja ma zostać wywołana w czasie wykonywania, na podstawie typu obiektu wskazywanego przez wskaźnik klasy bazowej.
Późne wiązanie lub łączenie dynamiczne
W przypadku późnego wiązania wywołanie funkcji jest rozwiązywane w czasie wykonywania. Dlatego kompilator określa typ obiektu w czasie wykonywania, a następnie wiąże wywołanie funkcji.
Reguły funkcji wirtualnej
projektowanie baz danych w dbm
- Funkcje wirtualne muszą należeć do jakiejś klasy.
- Funkcje wirtualne nie mogą być elementami statycznymi.
- Dostęp do nich można uzyskać poprzez wskaźniki obiektów.
- Mogą być przyjaciółmi innej klasy.
- Funkcja wirtualna musi być zdefiniowana w klasie bazowej, nawet jeśli nie jest używana.
- Prototypy funkcji wirtualnej klasy bazowej i wszystkich klas pochodnych muszą być identyczne. Jeśli dwie funkcje mają tę samą nazwę, ale różne prototypy, C++ uzna je za funkcje przeciążone.
- Nie możemy mieć wirtualnego konstruktora, ale możemy mieć wirtualny destruktor
- Rozważmy sytuację, gdy nie używamy słowa kluczowego virtual.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<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;>
Wyjście:
Value of x is : 5
W powyższym przykładzie * a jest wskaźnikiem klasy bazowej. Wskaźnik może uzyskać dostęp tylko do elementów klasy bazowej, ale nie do elementów klasy pochodnej. Chociaż C++ pozwala wskaźnikowi bazowemu wskazywać dowolny obiekt wywodzący się z klasy bazowej, nie może on uzyskać bezpośredniego dostępu do elementów klasy pochodnej. Dlatego istnieje zapotrzebowanie na funkcję wirtualną, która umożliwia wskaźnikowi bazowemu dostęp do elementów klasy pochodnej.
Funkcja wirtualna C++ Przykład
Zobaczmy prosty przykład funkcji wirtualnej C++ użytej do wywołania klasy pochodnej w programie.
#include { public: virtual void display() { cout << 'Base class is invoked'<<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;>
Wyjście:
Derived Class is invoked
Czysta funkcja wirtualna
- Funkcja wirtualna nie służy do wykonywania żadnego zadania. Służy jedynie jako element zastępczy.
- Gdy funkcja nie ma definicji, nazywa się ją „ nic nie robić funkcja.
- „ nic nie robić Funkcja jest znana jako a czysta funkcja wirtualna . Czysta funkcja wirtualna to funkcja zadeklarowana w klasie bazowej, która nie ma definicji względem klasy bazowej.
- Klasy zawierającej czystą funkcję wirtualną nie można używać do deklarowania własnych obiektów; takie klasy nazywane są abstrakcyjnymi klasami bazowymi.
- Głównym celem klasy bazowej jest nadanie cech klasom pochodnym i utworzenie wskaźnika bazowego używanego do osiągnięcia polimorfizmu środowiska wykonawczego.
Czystą funkcję wirtualną można zdefiniować jako:
virtual void display() = 0;
Zobaczmy prosty przykład:
np. nazwa użytkownika
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <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();>
W powyższym przykładzie klasa bazowa zawiera czystą funkcję wirtualną. Dlatego klasa bazowa jest abstrakcyjną klasą bazową. Nie możemy utworzyć obiektu klasy bazowej.