Co to jest wirtualne dziedzictwo?

Dziedziczenie wirtualne jest rodzajem dziedziczenia, w którym wdrożenie nadklasy jest niekompletne, a podklasa jest wymagana do pełnej definicji obiektu. Ten rodzaj dziedziczenia może być stosowany w połączeniu z dziedzictwem jedno i wielokrotnym, ale najczęściej stosuje się w wielu dziedzictwie. Każda klasa dziedzicząca z wirtualnej klasy podstawowej staje się bezpośrednią podklasą tej klasy podstawowej. Wirtualna klasa bazowa może polegać na podklasie w celu wdrożenia wszystkich jej metod, ale nie jest to wymóg.

C ++ jest najczęściej znanym językiem komputerowym do korzystania z wirtualnego dziedziczenia. Aby zadeklarować wirtualne dziedziczenie w C ++, używane jest „wirtualne” słowo kluczowe. Zarówno nadklasa, jak i podklasa muszą zadeklarować metody wirtualne za pomocą słowa kluczowego „wirtualnego”. To mówi kompilatorowi C ++, że nadklasa jest niekompletna i musi uzyskać informacje z podklasy, aby je wykonać. Używanie podklasy do wypełnienia nadklasy nie oznacza, że ​​podklasy zastępują się, jeśli mająTa sama klasa podstawowa, a zamiast tego kompilator C ++ dba o określenie, jakie elementy idą z każdym obiektem.

Ponieważ wirtualna klasa podstawowa jest wymagana do wirtualnego dziedziczenia, globalnych funkcji w C ++ nie można zadeklarować wirtualnego. Ten typ dziedziczenia można użyć tylko przy przestrzeganiu zasad programowania zorientowanych na obiekty (OOP). Powodem tego jest to, że funkcje globalne nie są powiązane z konkretną klasą, a zatem są samodzielne samodzielne. Bez nadklasy i dziedziczenia podklasy nie mogą się zdarzyć, więc globalne funkcje i dziedziczenie wirtualne wykluczają się wzajemnie. Funkcje globalne mogą być teoretycznie używane w funkcjach wirtualnych, ale odwrotnie nie zawsze może działać.

Wirtualne dziedziczenie służy do rozwiązania wielu problemów programistycznych, a jednym z najbardziej przydatnych jest rozdzielczość dwuznaczności. W wielu dziedziczeniach można mieć klasę podstawową A, która ma dwie podklasy, B iC, a następnie klasa D, która dziedziczy zarówno po klasach B, jak i C. Ten wzorzec jest powszechnie nazywany „diamentem śmierci”, ponieważ jeśli klasy A, B i C mają implementacje tej samej metody, klasa D nie może ustalić, z której implementacji powinna użyć. Wirtualne dziedziczenie rozwiązuje ten problem, ponieważ implementacja każdej klasy pozostaje odrębna, a zatem jednoznaczna. To rozróżnienie jest obsługiwane przez wyspecjalizowane obiekty wewnętrzne zwane tabelami wirtualnymi (vtables), które śledzą każdy typ obiektu, ale te tabele nie muszą być wyraźnie manipulowane przez programistę, ponieważ są one wbudowane w język.

INNE JĘZYKI