Co to jest funkcja wirtualna?
Funkcja wirtualna jest funkcją zdefiniowaną w superklasie, 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 ++ przy użyciu słowa kluczowego „wirtualnego”. 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 - lub zastąpiona, w zależności od tego, czy funkcja została zdefiniowana w superklasy.
Funkcję wirtualną 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 superklasy.
Istnieją zalety i wady dla obu metodologii. Definiowanie funkcji jako odcinka zapewnia, że wszystkie podklasy HAPewne jego 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 funkcje niewidoczne, 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 funkcji klasy A, ponieważ dziedziczy definicję klasy B. W razie potrzeby klasa C może zastąpić funkcję klasy B,Lub może to zastąpić funkcję klasy B, jednocześnie nazywając ją.
W drugiej ekstremalnej funkcji wirtualnych 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 B ma podklasy D i E, a podklasa C ma podklasy F i G.
Klasy B do G wszystkie muszą mieć jakoś zdefiniowane funkcje wirtualne klasy A. Jeśli klasa B ma wdrożenie funkcji A, klasy D i E nie potrzebują jej przerobki. Być może podklasy C muszą wdrożyć funkcję A, 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 przy prawidłowym użyciu mogą zmniejszyć duplikację kodu i ułatwić zrozumienie koduzazwyczaj. 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.