Flere arv i C ++ og diamantproblemet

I modsætning til mange andre objektorienterede programmeringssprog tillader C ++ flere arv.

Flere arv tillader en barneklasse at arve fra mere end en forældreklasse.

I begyndelsen virker det som en meget nyttig funktion. Men en bruger skal være opmærksom på et par gotchas, mens han implementerer denne funktion.

I eksemplerne nedenfor vil vi dække et par scenarier, som man skal være opmærksom på.

Vi starter med et simpelt eksempel for at forklare dette koncept i C ++.

Output af denne kode er som følger:

I'm breathing as a snake.I’m crawling as a snake.

I eksemplet ovenfor har vi en basisklasse, der hedder LivingThing . den Animalog krybdyrklasser arver fra det. Kun dyretklasse tilsidesætter metoden breathe(). De Snake klasse arver fra Animal og Reptile klasser. Det tilsidesætter deres metoder. I eksemplet ovenfor er der ikke noget problem. Vores kode fungerer godt.

Nu tilføjer vi lidt kompleksitet.

Hvad hvis reptilklasse tilsidesætter breathe()metoden?

Den Snake klasse ville ikke vide, hvilken breathe()metode til at ringe. Dette er "Diamantproblemet".

Diamantproblem

Se koden nedenfor. Det er som koden i eksemplet ovenfor, bortset fra at vi har tilsidesat breathe()metoden i reptilklassen .

Hvis du prøver at kompilere programmet, gør det det ikke. Du stirrer på en fejlmeddelelse som den nedenfor.

member ‘breathe’ found in multiple base classes of different types

Fejlen skyldes “Diamantproblemet” med flere arv. Den Snake klasse ikke ved, hvilken breathe()metode til at ringe.

I det første eksempel, er det kun Animal havde klassen tilsidesættes denbreathe()metode. Den Reptile klassen havde ikke. Derfor var det ikke meget vanskeligt for Snake- klassen at finde ud af, hvilken breathe()metode man skulle ringe til. Og Snake- klassen endte med at kalde breathe()metoden til Animal- klassen.

I det andet eksempel arver Snake-klassen tobreathe() metoder. Den breathe()metode for Animal og Reptile klasse. Da vi ikke har tilsidesat breathe()metoden i Snake- klassen, er der tvetydighed.

C ++ har mange kraftfulde funktioner såsom flere arv. Men det er ikke nødvendigt, at vi bruger alle de funktioner, det giver.

Jeg foretrækker ikke at bruge flere arv og bruge virtuel arv i stedet.

Virtuel arv løser det klassiske "Diamond Problem". Det sikrer, at barneklassen kun får en enkelt forekomst af den fælles baseklasse.

Med andre ord vil Snake- klassen kun have en forekomst af LivingThing- klassen. De Animal og Reptile klasser deler dette tilfælde.

Dette løser kompileringsfejlen vi modtager tidligere. Klasser afledt af abstrakte klasser skal tilsidesætte de rene virtuelle funktioner, der er defineret i basisklassen.

Jeg håber, du har haft denne oversigt over flere arv og "diamantproblemet".