Skip to main content

Co to jest funkcja wirtualna?

Funkcja wirtualna jest funkcją zdefiniowaną w superklasy, która musi być obecna w podklasie, aby ta podklasa ma pełną definicję klasy.Funkcje wirtualne opierają się na obiektowym paradygmatu programowania o nazwie Virtual Intheritance, który jest najczęściej widoczny w C ++ za pomocą wirtualnego słowa kluczowego.Aby zdefiniować funkcję wirtualną, konieczne są dwie klasy, nadklasa i podklasa.Superklasa jest miejscem, w którym funkcja jest najpierw zadeklarowana i prawdopodobnie zdefiniowana.Podklasa jest tam, gdzie funkcja jest zdefiniowana mdash;lub zastąpiony, w zależności od tego, czy funkcja została zdefiniowana w superklasie.

Funkcja wirtualna można zdefiniować na jeden z dwóch sposobów.Po pierwsze, można go zdefiniować jako odcinek, w którym ma puste ciało i nic nie robi.Po drugie, można go zdefiniować jako czystą funkcję wirtualną, w której jest zdefiniowana jako zerowa w pliku nagłówka SuperClasss.

Istnieją zalety i wady dla obu metodologii.Definiowanie funkcji jako odcinka zapewnia, że wszystkie podklasy mają pewną jej wdrożenie, nawet jeśli nic nie robi.Jeśli zapomina się o zastąpieniu funkcji i poprawnie zaimplementowania jej w podklasie, nie pojawią się to błędy ani ostrzeżenia.Z drugiej strony definiowanie czystej funkcji wirtualnej wymaga, aby każda podklasa miała własną definicję funkcji, a błędy pojawią się, jeśli tak nie jest.

Funkcje wirtualne podlegają jednak tym samym regułom dziedziczenia co nie-Funkcje wirtualne, więc hierarchie dziedziczenia z więcej niż dwoma poziomami mogą nie wymagać wyraźnych definicji funkcji wirtualnych.Na przykład można rozważyć klasę A, która deklaruje funkcję wirtualną, która jest zaimplementowana w podklasie B. Klasa B ma własną podklasę, klasa C. Klasa C nie wymaga wyraźnej definicji klasy jako funkcji, ponieważ dziedziczyDefinicja klasy B. W razie potrzeby klasa C może zastąpić funkcję klasy BS lub może zastąpić funkcję klasy BS, jednocześnie nazywając ją.

W drugiej skrajnej funkcje wirtualne nie muszą być zdefiniowane w podklasie, jeśli są one ogłoszone wirtualne w tej podklasie.Na przykład można rozważyć klasę A, która deklaruje funkcję wirtualną i ma dwie podklasy, B i C. Ponadto można sobie wyobrazić, że klasa Klasa B ma podklasy D i E, a podklasa C ma podklasy F i G.

KlasyB do G, wszyscy muszą mieć klasę jako funkcję wirtualną, jakoś zdefiniowana.Jeśli klasa B ma implementację funkcji, klasy D i E nie potrzebują jej przerobki.Być może podklasy CS muszą zaimplementować jako funkcję, ale oba robią coś innego, więc zdefiniowanie funkcji w samej klasie C nie byłoby przydatne.W takim przypadku funkcja może być zadeklarowana wirtualna w klasie C, a implementacja nie jest konieczna.

Funkcje wirtualne mogą być zniechęcające do nauki, ale w przypadku prawidłowego użycia mogą zmniejszyć duplikację kodu i znacznie ułatwić zrozumienie kodu w ogóle zrozumienie.Istnieje jednak wiele pułapek z funkcjami wirtualnymi, zwłaszcza dotyczące wielokrotnego dziedziczenia.W wielu dziedziczeniach możliwe jest, że niejednoznacznie zdefiniowane funkcje wirtualne są ze sobą sprzeczne, więc należy je używać ostrożnie w tym kontekście.