Jak zaimplementować funkcję wirtualną w C ++?



Ten artykuł wprowadzi Cię w jeszcze jedną koncepcję programowania, jaką jest funkcja wirtualna w C ++. Koncepcja będzie wspierana demonstracją.

Wirtualna funkcja w C ++ jest funkcją składową w klasie bazowej, którą przedefiniowaliśmy w klasie pochodnej. Ten artykuł pomoże ci szczegółowo zbadać tę koncepcję. Następujące wskaźniki zostaną omówione w tym artykule,

Zacznijmy więc od tego artykułu na temat funkcji wirtualnych w C ++





Co to jest funkcja wirtualna?

Funkcja wirtualna to funkcja składowa w klasie bazowej, którą przedefiniowaliśmy w klasie pochodnej. Jest deklarowana przy użyciu słowa kluczowego virtual. Gdy klasa zawierająca funkcję wirtualną jest dziedziczona, klasa pochodna na nowo definiuje funkcję wirtualną w celu dostosowania jej do własnych potrzeb.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++



Zasady funkcji wirtualnej w C ++:

  • Są zawsze zdefiniowane w klasie bazowej i zastępowane w klasie pochodnej, ale przesłanianie w klasie pochodnej nie jest obowiązkowe.
  • Funkcje wirtualne muszą być zadeklarowane w publicznej sekcji klasy.
  • Nie mogą być statyczne ani przyjacielskie, nie mogą też być wirtualnymi funkcjami innej klasy.
  • Dostęp do funkcji wirtualnych należy uzyskiwać za pomocą wskaźnika, aby uzyskać polimorfizm w czasie wykonywania.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++.

Co to jest wiążące?

Powiązanie dla funkcji oznacza, że ​​wszędzie tam, gdzie występuje wywołanie funkcji, kompilator musi wiedzieć, do której definicji funkcji ma być dopasowana. Zależy to od podpisu każdej deklaracji funkcji i przyjętych przypisań. Ponadto kompilator musi wiedzieć, że kiedy nastąpi dopasowanie między wywołaniem funkcji a wybraniem prawidłowej definicji.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++



Wczesne wiązanie

Wczesne wiązanie to zjawisko, w którym decyzja o dopasowaniu różnych wywołań funkcji ma miejsce w samym czasie kompilacji, a kompilator bezpośrednio wiąże łącze z adresami. Jest również znany jako wiązanie statyczne lub wiązanie w czasie kompilacji.

  • Jak wiemy, piszemy kod w języku wysokiego poziomu
  • Następnie kompilator konwertuje to na język niskiego poziomu, który komputer może zrozumieć, głównie język maszynowy w momencie kompilacji
  • We wczesnym wiązaniu kompilator bezpośrednio dostarcza adres instrukcji deklaracji funkcji do instrukcji wywołania funkcji
  • Tak więc, jak sugeruje nazwa, wiązanie następuje bardzo wcześnie przed uruchomieniem programu.

Przykład

#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 () // wczesne wiązanie return 0}

Wynik

Wyjście - funkcja wirtualna w C ++ - Edureka

wyjaśnienia jon
W tym przykładzie utworzyliśmy wskaźnik a do klasy nadrzędnej Animals. Następnie, pisząc a = & c, wskaźnik „a” zaczął odnosić się do obiektu c klasy Koty.
a -> sound () - Po wywołaniu funkcji sound (), która jest obecna w obu klasach przez wskaźnik 'a', została wywołana funkcja klasy nadrzędnej, nawet jeśli wskaźnik odwołuje się do obiektu klasy Koty .

Wynika to z wczesnego wiązania. Wiemy, że „a” to wskaźnik klasy nadrzędnej odnoszący się do obiektu klasy potomnej. Ponieważ wczesne wiązanie ma miejsce w czasie kompilacji, więc gdy kompilator zobaczył, że „a” jest wskaźnikiem klasy nadrzędnej, dopasował wywołanie do funkcji „sound ()” klasy nadrzędnej bez szukania obiektu po wskazaniu odnosi się do.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++

Późne wiązanie

W późnym wiązaniu kompilator identyfikuje obiekt w czasie wykonywania, a następnie dopasowuje wywołanie funkcji do prawidłowej funkcji. Jest również znany jako powiązanie dynamiczne lub powiązanie środowiska uruchomieniowego.

Późne wiązanie w powyższym problemie można rozwiązać za pomocą słowa kluczowego virtual w klasie bazowej. Zobaczmy, jak to się dzieje, korzystając z samego powyższego przykładu, ale dodając tylko wirtualne słowo kluczowe.

Przykład

#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 () return 0}

Wynik

jak zakończyć metodę w java

Wyjaśnienie
Tutaj funkcja sound () klasy bazowej jest wirtualna, więc kompilator wykonuje teraz późne wiązanie dla tej funkcji. Teraz wywołanie funkcji sound () zostanie dopasowane do definicji funkcji w czasie wykonywania. Ponieważ kompilator identyfikuje teraz wskaźnik „a” jako odnoszący się do obiektu „c” pochodnej klasy Cats, wywoła funkcję sound () klasy Cats.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++

Czysta funkcja wirtualna

Czysta funkcja wirtualna w C ++ to funkcja wirtualna, dla której nie mamy implementacji, tylko ją deklarujemy. Czystą funkcję wirtualną deklaruje się przez przypisanie 0 w deklaracji.

virtual void sound () = 0

Tutaj sound () jest czystą funkcją wirtualną.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++

Klasa abstrakcyjna

Klasa abstrakcyjna jest definiowana jako klasa z co najmniej jedną czystą funkcją wirtualną. Jak wyjaśniono powyżej, czysta funkcja wirtualna jest wirtualną funkcją składową, która jest oznaczona jako nieposiadająca implementacji. Nie ma możliwości implementacji z informacjami zawartymi w klasie, w tym z klasami bazowymi. Klasa abstrakcyjna jest również nazywana abstrakcyjną klasą bazową.

Przykład

#include using namespace std class Employee // abstrakcyjna klasa bazowa {virtual int getSalary () = 0 // czysta funkcja wirtualna} class Employee_1: public Employee {int salary public: Employee_1 (int s) {salary = s} int getSalary () {wynagrodzenie zwrotne}} class Employee_2: public Employee {int salary public: Employee_2 (int t) {salary = t} int getSalary () {Return salary}} 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 } 

Wynik

Wyjaśnienie
Funkcja „getSalary ()” w klasie Employee jest czystą funkcją wirtualną. Ponieważ klasa Employee zawiera czystą funkcję wirtualną, jest więc abstrakcyjną klasą bazową.
Ponieważ czysta funkcja wirtualna jest zdefiniowana w podklasach, dlatego funkcja „getSalary ()” jest zdefiniowana w obu podklasach klasy Employee, tj. W Employee_1 i Employee_2.

Przechodząc do tego artykułu na temat funkcji wirtualnych w C ++

Przykład funkcji wirtualnej

#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 ()}

Wynik

Wyjaśnienie
W przypadku wywołania funkcji function_1 () wywoływana jest wersja funkcji z klasy bazowej, funkcja_2 () jest nadpisywana w klasie pochodnej, więc wywoływana jest wersja klasy pochodnej, funkcja_3 () nie jest zastępowana w klasie pochodnej i jest funkcją wirtualną, więc wywoływana jest wersja klasy bazowej, podobnie function_4 () nie jest nadpisywane, więc wywoływana jest wersja klasy bazowej.

W ten sposób dotarliśmy do końca artykułu „Funkcja wirtualna w C ++”. Jeśli chcesz dowiedzieć się więcej, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online. Szkolenie i certyfikacja J2EE i SOA firmy Edureka ma na celu przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na tym blogu, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.