Skip to main content

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.Klasa wirtualna podstawowa może polegać na podklasie w celu wdrożenia wszystkich jej metod, ale nie jest to wymagane.

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ą wirtualnego słowa kluczowego.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ę nawzajem, jeśli mają tę samą klasę podstawową, a zamiast tego kompilator C ++ zajmuje się określeniem, jakie elementy idą z każdym obiektem.

, ponieważ wirtualna klasa bazowa jest wymagana do wirtualnejDziedzictwo, globalnych funkcji w C ++ nie może być zadeklarowane wirtualne.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ć.

Dziedziczenie wirtualne służy do rozwiązania wielu problemów programistycznych, a jednym z najbardziej przydatnych jest rozdzielczość dwuznaczności.W wielokrotnym dziedziczeniu można mieć podstawową klasę A, która ma dwie podklasy, B i C, a następnie klasa D, która dziedziczy zarówno po klasach B i C. Ten wzór jest powszechnie nazywany diamentem śmierci, ponieważ jeśli klasy a, b,a c wszystkie mają implementacje tej samej metody, klasa D nie jest możliwa do ustalenia, z której implementacji powinna użyć.Wirtualne dziedziczenie rozwiązuje ten problem, ponieważ implementacja każdej klasy pozostaje wyraźna, 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.