Różnica między funkcją wirtualną a czystą funkcją wirtualną

Autor: Laura McKinney
Data Utworzenia: 2 Kwiecień 2021
Data Aktualizacji: 17 Móc 2024
Anonim
Różnica między funkcją wirtualną a czystą funkcją wirtualną - Technologia
Różnica między funkcją wirtualną a czystą funkcją wirtualną - Technologia

Zawartość


Zarówno funkcja wirtualna, jak i funkcja czysto wirtualna są pojęciami polimorfizmu w czasie wykonywania. Główna różnica między „funkcja wirtualna ” i „Czysta funkcja wirtualna” jest to, że „funkcja wirtualna” ma swoją definicję w klasie podstawowej, a także dziedziczące klasy pochodne ją redefiniują. Czysta funkcja wirtualna nie ma definicji w klasie bazowej, a wszystkie dziedziczące klasy pochodne muszą ją przedefiniować.

Jednak funkcja wirtualna jest również wywoływana jako dynamiczne wysyłanie i wysyłanie w czasie wykonywania, ponieważ wywoływana funkcja jest określona w czasie wykonywania zgodnie z typem użytego obiektu.

Polimorfizm jest obsługiwany zarówno przez języki C ++, jak i Java. W Javie zamiast „funkcji wirtualnej” używany jest termin „zastępowanie”, ponieważ funkcja wirtualna to C ++.

  1. Wykres porównania
  2. Definicja
  3. Kluczowe różnice
  4. Wniosek

Wykres porównania

Podstawa do porównaniaFunkcja wirtualnaCzysta funkcja wirtualna
PodstawowyFunkcja wirtualna ma swoją definicję w klasie bazowej.Czysta funkcja wirtualna nie ma definicji w klasie bazowej.
Deklaracjawirtualna nazwa_funkcji (lista parametrów) {. . . . .};wirtualna nazwa_funkcji (lista parametrów) = 0;
Klasy pochodnejWszystkie klasy pochodne mogą, ale nie muszą, zastępować funkcję wirtualną klasy podstawowej.Wszystkie klasy pochodne muszą przesłonić funkcję wirtualną klasy podstawowej.
Efekt

Funkcje wirtualne mają charakter hierarchiczny; nie wpływa to na kompilację, jeśli jakiekolwiek klasy pochodne nie przesłaniają funkcji wirtualnej klasy podstawowej.Jeśli wszystkie klasy pochodne nie zastąpią funkcji wirtualnej klasy podstawowej, wystąpi błąd kompilacji.
Klasa abstrakcyjnaBez koncepcji.Jeśli klasa zawiera co najmniej jedną czystą funkcję wirtualną, zostaje uznana za abstrakcyjną.


Definicja funkcji wirtualnej

The funkcja wirtualna jest funkcją składową klasy podstawowej i jest redefiniowana przez klasy pochodne, które dziedziczą klasę podstawową. Nie jest konieczne, aby wszystkie dziedziczące klasy pochodne musiały na nowo zdefiniować funkcję wirtualną, jest tylko na nowo zdefiniowane przez te klasy pochodne, które mogą wymagać jej funkcjonowania. Funkcja wirtualna jest tworzona przez zadeklarowanie funkcji w klasie bazowej poprzedzonej słowem kluczowym 'wirtualny'.

Deklaracja:

klasa base {public: typ wirtualny funt_name (lista parametrów) {. . . }};

Dziedziczące klasy pochodne mogą przedefiniować funkcję wirtualną bez żadnego słowa kluczowego „wirtualnego”. Klasy pochodne na nowo definiują funkcję wirtualną, aby zrealizować swoje zadanie. Ponieważ funkcja wirtualna została przedefiniowana w klasach pochodnych, mamy wiele postaci tej samej funkcji. Teraz, która wersja funkcji jest wywoływana, zależy od tego, do jakiego obiektu odwołuje się ta funkcja.


Dziedziczenie wielopoziomowe

W dziedziczeniu wielopoziomowym, w którym klasa pochodna, która odziedziczyła funkcję wirtualną od swojej klasy podstawowej, gdy sama jest używana jako klasa podstawowa dla innej klasy pochodnej, funkcja wirtualna nadal może zostać zastąpiona. Kiedy dziedziczona jest funkcja wirtualna, dziedziczona jest również jej wirtualna natura.

Funkcje wirtualne mają również charakter hierarchiczny, tj. Jeśli klasa pochodna nie zastępuje / nie redefiniuje funkcji wirtualnej odziedziczonej z klasy podstawowej i gdy obiekt klasy pochodnej wywołuje tę funkcję wirtualną, wówczas wywoływana jest funkcja wirtualna zdefiniowana przez klasę podstawową.

Definicja czystej funkcji wirtualnej

Jak widać powyżej, jeśli klasa pochodna nie przesłania funkcji wirtualnej, wówczas używana jest funkcja wirtualna zdefiniowana przez klasę podstawową. Ale co jeśli sama klasa podstawowa nie definiuje funkcji wirtualnej. Wiele razy klasa podstawowa nie ma definicji funkcji wirtualnej, a czasem zależy, aby wszystkie klasy pochodne musiały zastąpić funkcję wirtualną.

Aby poradzić sobie z powyższymi dwiema sytuacjami, C ++ obsługuje pojęcie „Czysta funkcja wirtualna„. „Funkcja czysto wirtualna” jest zadeklarowana w klasie podstawowej, ale nie ma jej definicji w klasie podstawowej. Czysta funkcja wirtualna jest zadeklarowana w następujący sposób.

typ wirtualny nazwa_funkcji (lista parametrów) = 0;

Ilekroć funkcja wirtualna w klasie bazowej staje się „czysta”, wówczas każda klasa pochodna musi obowiązkowo zastąpić czystą funkcję wirtualną klasy bazowej. Jeśli klasa pochodna nie zastąpi funkcji wirtualnej klasy podstawowej, spowoduje to błąd kompilacji.

Klasa abstrakcyjna

Klasa zawierająca co najmniej jedną czystą funkcję nazywa się „klasą abstrakcyjną”. Nie można tworzyć obiektów klas abstrakcyjnych, ale można tworzyć odniesienia i wskaźniki do klas abstrakcyjnych. Dostęp do członków klas abstrakcyjnych można uzyskać poprzez obiekt klas pochodnych, który dziedziczy abstrakcyjną klasę podstawową.

Klasa, którą chcesz zadeklarować jako abstrakcyjną, użyj słowa kluczowego 'abstrakcyjny' przed 'klasa' słowo kluczowe.

// na przykład abstrakcyjna nazwa klasy klasa {. . typ wirtualny nazwa_funkcji (lista parametrów) = 0; . . };

  1. Funkcje wirtualne są zdecydowanie zdefiniowane w klasie bazowej i przedefiniowane (nadpisane) w klasie pochodnej. Z drugiej strony czysta funkcja wirtualna klasy bazowej nie jest szczególnie zdefiniowana w klasie bazowej
  2. W razie potrzeby klasa pochodna przedefiniowuje (zastępuje) funkcję wirtualną, natomiast w przypadku funkcji czysto wirtualnej klasa pochodna musi zdecydowanie przedefiniować czystą funkcję wirtualną.
  3. Jeśli klasa pochodna nie przedefiniuje (zastąpi) funkcję wirtualną, może skorzystać z funkcji wirtualnej klasy podstawowej. I odwrotnie, jeśli klasa pochodna nie zastąpi funkcji czysto wirtualnej, wówczas wystąpi błąd kompilacji.
  4. Można utworzyć instancję klasy podstawowej zawierającej funkcję wirtualną, tzn. Można utworzyć jej obiekt. Przeciwnie, klasy bazowej zawierającej czystą funkcję wirtualną, tj. Klasy abstrakcyjnej, nie można utworzyć instancji, ponieważ klasa abstrakcyjna nie jest w pełni zdefiniowana.

Uwaga:
Prototyp „funkcji wirtualnej” i „czystej funkcji wirtualnej” pozostaje taki sam w całym programie.

Wniosek:

Zarówno „funkcje wirtualne”, jak i „czysta funkcja wirtualna” mają swoje znaczenie, ponieważ w „funkcjach wirtualnych” wszystkie klasy pochodne nie muszą na nowo definiować funkcji wirtualnej, a tam, gdzie chcemy, aby wszystkie klasy pochodne na nowo zdefiniowały funkcję wirtualną, czysto wirtualna funkcja najlepiej tam ma zastosowanie.