Flere arv i C ++ og diamantproblemet

I motsetning til mange andre objektorienterte programmeringsspråk, tillater C ++ flere arv.

Flere arv gjør at en barneklasse kan arve fra mer enn en foreldreklasse.

I begynnelsen virker det som en veldig nyttig funksjon. Men en bruker må være oppmerksom på noen få gotchas mens han implementerer denne funksjonen.

I eksemplene nedenfor vil vi dekke noen få scenarier som man trenger å være oppmerksom på.

Vi begynner med et enkelt eksempel for å forklare dette konseptet i C ++.

Resultatet av denne koden er som følger:

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

I eksemplet ovenfor har vi en basisklasse som heter LivingThing . The Animalog reptilklasser arver fra det. Bare dyretklasse overstyrer metoden breathe(). De Snake klassen arver fra Animal og Reptile klasser. Det overstyrer metodene deres. I eksemplet ovenfor er det ikke noe problem. Koden vår fungerer bra.

Nå vil vi legge til litt kompleksitet.

Hva om reptilklasse overstyrer breathe()metoden?

The Snake klassen ville ikke vite hvilken breathe()metode for å ringe. Dette er "Diamantproblemet".

Diamantproblem

Se på koden nedenfor. Det er som koden i eksemplet ovenfor, bortsett fra at vi har overstyrt breathe()metoden i reptilklassen .

Hvis du prøver å kompilere programmet, vil det ikke. Du vil stirre på en feilmelding som den nedenfor.

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

Feilen skyldes “Diamantproblemet” med flere arv. The Snake klassen vet ikke hvilken breathe()metode for å ringe.

I det første eksemplet var det kun dyreklassen som hadde overstyrtbreathe()metode. The Reptile klassen ikke hadde. Derfor var det ikke veldig vanskelig for Snake- klassen å finne ut hvilken breathe()metode man skulle ringe. Og Snake- klassen endte med å kalle breathe()metoden for Animal- klassen.

I det andre eksemplet arver Snake-klassen tobreathe() metoder. Den breathe()Fremgangsmåten ifølge dyr og reptil klasse. Siden vi ikke har overstyrt breathe()metoden i Snake- klassen, er det tvetydighet.

C ++ har mange kraftige funksjoner som flere arv. Men det er ikke nødvendig at vi bruker alle funksjonene den gir.

Jeg foretrekker ikke å bruke flere arv og bruke virtuell arv i stedet.

Virtuell arv løser det klassiske “Diamond Problem”. Det sikrer at barneklassen bare får en enkelt forekomst av den vanlige baseklassen.

Med andre ord vil Snake- klassen bare ha en forekomst av LivingThing- klassen. De Animal og Reptile klasser dele dette tilfellet.

Dette løser kompileringstidsfeilen vi mottok tidligere. Klasser avledet fra abstrakte klasser må overstyre de rene virtuelle funksjonene som er definert i basisklassen.

Jeg håper du likte denne oversikten over flere arv og "Diamond Problem".