Problem z diamentem C ++

Problem z diamentem C ++
Problem z diamentem to problem, który występuje w językach programowania, szczególnie w C ++, gdy używasz wielu dziedziczeń. Wiele dziedziczeń w C ++ jest powszechnie używanych jako narzędzie, gdy kod jest bardzo długi. Aby obsłużyć kod źródłowy, używamy klas do zarządzania programem. Jednak wiele dziedziczeń powoduje problem, jeśli nie jest on właściwie używany. Problemy te zawierają głównie problem z diamentami. Ten samouczek ma na celu podkreślenie głównych czynników problemu diamentowego, jak występuje on z wielu dziedziczeń i wszystkich rozwiązań wymaganych do jego rozwiązania.

Aby wykonać programy dotyczące „dziedziczenia Diamond C ++” w systemie operacyjnym Linux, musisz zainstalować system Ubuntu na maszynie wirtualnej. Używane są dwa narzędzia. Jednym z nich jest dowolne narzędzie do edycji i jako takie użyjemy domyślnego „edytora tekstu” Linux. Możesz użyć innych preferowanych narzędzi do edycji. Drugi to terminal Ubuntu. Na którym uruchomisz program i możesz zobaczyć wyświetlane dane wyjściowe.

Najpierw omówimy wiele dziedziczeń w artykule, ponieważ „problem z diamentem” występuje w przypadku dziedziczenia w kodzie źródłowym.

Wiele dziedziczeń w C++

Kiedy mówimy o hierarchicznym stosowaniu klas w programie, zawsze znamy OOP (programowanie obiektowe). Ponieważ to dziedziczenie jest ważną cechą zorientowanej na obiekt, w której podklasa jest w stanie odziedziczyć po jednej lub więcej nadklasach. W ten sposób klasa dziecięca ma dwóch lub więcej rodziców.

Na przykład, jeśli matka i ojciec mają dziecko w prawdziwym scenariuszu, dziecko odziedziczy wszystko od rodziców. Więc to dziecko jest znane jako klasa pochodna z matką i ojcem jako rodzice. Wróćmy do wielu dziedziczeń. Będziemy używać „konstruktorów” jako części naszej obecnej dyskusji. Konstruktorzy odziedziczonej klasy (klasa dziecięca) w wielu dziedziczeniach wykonują się, postępując zgodnie z odziedziczoną kolejnością. Natomiast dla destruktorów kolejność jest odwrotnością dziedzictwa. Teraz zacytujemy prosty przykład, aby zademonstrować funkcjonalność dziedziczenia w C++.

Przykład wielu dziedziczeń

Rozważ przykład, w którym istnieją dwie klasy, klasę A i klasy B, jako klasa nadrzędna, a te dwie klasy mają klasę dzieci o nazwie klasa C. Ta klasa jest pochodną klasą obu jej rodziców. Użyjemy konstruktora w części publicznej każdej klasy.

Pierwszym krokiem w kodzie jest użycie biblioteki, aby umożliwić przesyłanie strumieniowe wejścia:

Następnie musimy zadeklarować klasę A, mając konstruktory o nazwie klasy. Jak wiesz, że konstruktorzy są zadeklarowani nazwą tej klasy, a są one wywoływane za każdym razem, gdy obiekt jest tworzony. W konstruktorze wyświetlono prosty komunikat, który pokazuje, który konstruktor klas jest wykonywany. Teraz definiujemy klasę B z tym samym podejściem. Po obu klasach rodziców wspomniana jest klasa dziecięca.

Jedną rzeczą, którą należy tutaj zauważyć, jest kolejność klas nadrzędnych, które dziecko dziedziczy, ponieważ zamówienie będzie miało znaczenie w momencie wykonania konstruktora i wyświetlanie wiadomości.

Teraz, w klasie głównej, stworzymy obiekt klasy dzieci. Ponieważ ma wiele dziedziczeń, nie ma potrzeby tworzenia obiektu dla klasy nadrzędnej. Są one automatycznie wykonywane z powodu obiektu klasy dzieci:

Int main ()
C c;
Powrót 0;

Po napisaniu poprzedniego kodu w edytorze tekstu zapisz ten plik z rozszerzeniem „.C'. Wykonamy plik w terminalu Ubuntu. W celu wykonania wymagany jest kompilator. W C ++ używamy kompilatora G ++. W przeciwnym razie musisz najpierw go zainstalować:

$ G ++ -o m1 m1.C
$ ./M1

Użyj G ++ z nazwą pliku o kodzie źródłowym i tym, w którym chcesz pokazać wyjście. Uwaga: -O służy do zapisania wyjścia. Ponieważ klasa B jest odziedziczona powyżej klasy A, więc jego konstruktor jest wykonywany najpierw, możesz zobaczyć dane wyjściowe z poprzedniego obrazu.

Ponieważ koncepcja dziedziczenia jest teraz jasna, omówimy tutaj „problem z diamentem”.

Problem z diamentem

Problem z diamentem jest przypadkiem tylko w wielu dziedziczeniach, które występują, gdy klasa dziecięca ma odziedziczone wartości od dwojga rodziców. Gdzie te klasy rodziców są dziedziczone po wspólnej klasie dziadka.

Na przykład rozważ przykład, w którym mamy klasę dzieci odziedziczoną po klasach matki i ojca. Klasy te dziedziczą trzecią klasę o nazwie „osoba”:

Dziecko> matka> osoba
> Ojciec> osoba

Tak więc, zgodnie z danym scenariuszem, klasa dzieci dziedziczy klasę „osoby” dwa razy w programie. Kiedyś pochodzi od matki i znowu drugi raz pochodzi od Ojca. Stwarza to zamieszanie, aby kompilator mógł wykonywać pierwszy konstruktor. Ta sytuacja powoduje wykres dziedzilny w kształcie diamentu. Dlatego jest znany jako „problem z diamentem”.

Podejście kodowe jest prawie takie samo. Dokonaj klas podstawowych, a następnie dwóch odziedziczonych dzieci (matki, ojca) klas klasy podstawowej. Po każdej klasie następuje konstruktor ze zmienną do przechowywania w niej wartości:

Teraz wprowadzenie klasy dzieci:

# Class Child: Public Father, Public Mother

Klasa dziecka odziedziczy obie klasy rodziców. Główna funkcja użyje obiektu dziecka i wartości w parametrze wywołania konstruktora:

Po zapisaniu kodu nadszedł czas, aby użyć kompilatora do wykonania i zobacz wynik:

Teraz możesz zauważyć, że klasa podstawowa nazywa się dwa razy. To jest problem z diamentami. Po opisaniu problemu znajdziemy teraz możliwe rozwiązanie.

Rozwiązanie problemu diamentowego

Rozwiązanie zależy od użycia słowa kluczowego „wirtualnego”. Zajęcia dwóch rodziców ze wspólną klasą podstawową odziedziczą teraz klasę podstawową praktycznie, aby zminimalizować występowanie kopii klasy podstawowej w klasie dzieci. Teraz zmodyfikujemy kod za pomocą tego słowa kluczowego:

Ilekroć klasa rodziców dziedziczy po klasie dziadka, „wirtualne” jest używane, ale tylko z rodzicami, a nie w przypadku dziecka. To jest „wirtualne dziedzictwo”. Ogranicza podanie więcej niż jednej instancji od klasy podstawowej, która ma zostać przekazana.

# Klasa ojciec: wirtualna osoba publiczna

Teraz wykonamy kod. Wynikowe wartości pokazują, że niejednoznaczność jest usuwana przy użyciu tej koncepcji:

Aby uniknąć powtarzania konstruktora podstawowego, który ma zostać wywołany, konstruktor wirtualnej klasy podstawowej nie jest osiągany przez klasę, która ją odziedziczyła. Jednak ten konstruktor jest wywoływany z konstruktora klasy konkretnej. W obecnym przykładzie klasa dziecięca nazywa bezpośrednio konstruktora klasy „osoby”.

Wniosek

„C ++ Diamond Problem” to artykuł napisany w celu usunięcia dwuznaczności powtórzenia klasy podstawowej w wielu dziedziczeniach. Koncepcja dziedziczenia jest krótko wyjaśniona przykładami. Podobnie przyczyna i rozwiązanie problemu diamentowego są również szczegółowo opracowane. Mamy nadzieję, że ten samouczek może dostarczyć wskazówek w dziedzinie programów C ++.