Mitu pärandit C ++ ja teemandiprobleem

Erinevalt paljudest muudest objektorienteeritud programmeerimiskeeltest võimaldab C ++ mitut pärandit.

Mitmekordne pärimine võimaldab lasteklassil pärida rohkem kui ühest vanemklassist.

Kohe alguses tundub see väga kasulik funktsioon. Kuid kasutaja peab selle funktsiooni rakendamisel arvestama mõnega .

Alljärgnevates näidetes käsitleme mõnda stsenaariumi, mille puhul tuleb olla tähelepanelik.

Alustame lihtsa näitega, kuidas seda mõistet C ++ keeles selgitada.

Selle koodi väljund on järgmine:

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

Ülaltoodud näites on meil baasklass nimega LivingThing . Animalja roomajate klassid pärivad sellest. Ainult loomklass alistab meetodi breathe(). Snake klassi pärib alates Loomade ja Roomajate klassi. See alistab nende meetodid. Ülaltoodud näites pole probleemi. Meie kood töötab hästi.

Nüüd lisame natuke keerukust.

Mis siis, kui roomajate klass alistab breathe()meetodi?

Snake klassi ei tea, mis breathe()meetod helistada. See on “Teemantprobleem”.

Teemantprobleem

Vaadake allolevat koodi. See on nagu ülaltoodud näite kood, välja arvatud see, et oleme breathe()meetodi Roomajad klassis alistanud .

Kui proovite programmi kompileerida, siis seda ei tehta. Vaatate sellist veateadet nagu allpool.

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

Viga tuleneb mitmekordse pärimise “teemandiprobleemist”. Snake klassi ei tea, mis breathe()meetod helistada.

Esimeses näites ainult Animal klassi oli ignoreeribbreathe()meetod. Roomajate klassi ei olnud. Seega polnud madu klassil väga keeruline välja mõelda, millist breathe()meetodit helistada. Ja madu klass kutsus lõpuks loomade klassi breathe()meetodi .

Teises näites pärib klass Snake kahtebreathe() meetodit. breathe()Meetod Loomade ja Roomajate klassi. Kuna me pole madu klassis breathe()meetodist üle käinud, on selles ebaselgust.

C ++ -s on palju võimsaid funktsioone, näiteks mitmekordne pärimine. Kuid pole vaja, et kasutaksime kõiki selle pakutavaid funktsioone.

Ma ei eelista mitme pärandi kasutamist ja kasutan selle asemel virtuaalset pärimist.

Virtuaalne pärimine lahendab klassikalise “Teemantprobleemi”. See tagab, et lasteklass saab ühisest põhiklassist ainult ühe eksemplari.

Teisisõnu, madu klassil on LivingThingi klassist ainult üks eksemplar . Loomade ja Roomajate klassi jagada seda näiteks.

See lahendab varem saadud kompileerimisaja vea. Abstraktsetest klassidest tuletatud klassid peavad alistama põhiklassis määratletud puhtad virtuaalsed funktsioonid.

Loodan, et teile meeldis see ülevaade mitmekordsest pärimisest ja “Teemantprobleem”.