Daugkartinis paveldėjimas C ++ ir deimanto problema

Skirtingai nuo daugelio kitų į objektą orientuotų programavimo kalbų, C ++ leidžia daugybę paveldėjimų.

Daugkartinis paveldėjimas leidžia vaikų klasei paveldėti iš daugiau nei vienos tėvų klasės.

Pradžioje tai atrodo labai naudinga funkcija. Tačiau vartotojas , įgyvendindamas šią funkciją, turi atsižvelgti į keletą „ getchų “.

Toliau pateiktuose pavyzdžiuose aptarsime keletą scenarijų, į kuriuos reikia atsižvelgti.

Pradėsime nuo paprasto pavyzdžio, kad paaiškintume šią sąvoką C ++.

Šio kodo išvestis yra tokia:

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

Aukščiau pateiktame pavyzdyje turime pagrindinę klasę, pavadintą „ LivingThing“ . gyvūnųir roplių klasės paveldi iš jo. Tik Gyvūnasklasė nepaiso metodo breathe(). Į Snake klasė paveldi iš į gyvūnų ir roplių klasėms. Tai viršija jų metodus. Aukščiau pateiktame pavyzdyje nėra jokių problemų. Mūsų kodas veikia gerai.

Dabar pridėsime šiek tiek sudėtingumo.

Ką daryti, jei Roplių klasė pakeis breathe()metodą?

Gyvatė klasė nebūtų žinoti, kuris breathe()būdas skambinti. Tai yra „Deimanto problema“.

Deimanto problema

Pažvelkite į žemiau esantį kodą. Tai panašus į kodą aukščiau pateiktame pavyzdyje, išskyrus tai, kad breathe()metodo nepaisėme „Reptile“ klasėje.

Jei bandysite sudaryti programą, ji nebus. Spoksosite į klaidos pranešimą, tokį kaip žemiau.

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

Klaida atsirado dėl daugelio paveldėjimo „deimantų problemos“. Gyvatė klasė neturi žinoti, kuris breathe()būdas skambinti.

Pirmajame pavyzdyje tik gyvūnų klasė panaikinobreathe()metodas. Roplių klasės nebuvo. Taigi gyvatės klasei nebuvo labai sunku išsiaiškinti, kurį breathe()metodą paskambinti. Ir gyvatė klasė baigėsi paskambinę breathe()metodo gyvūnų klasė.

Antrame pavyzdyje gyvatės klasė paveldi dubreathe() metodus. breathe()Iš metodas gyvūnų ir Reptile klasėje. Kadangi gyvatės klasėje breathe()metodo nepaisėme , yra neaiškumų.

„C ++“ turi daug galingų funkcijų, tokių kaip daugybinis paveldėjimas. Tačiau nebūtina naudoti visas jo teikiamas funkcijas.

Nenorėčiau naudoti kelių paveldėjimų, o vietoj jų naudoti virtualų paveldėjimą.

Virtualus paveldėjimas išsprendžia klasikinę „Deimanto problemą“. Tai užtikrina, kad vaikų klasė gauna tik vieną bendros bazinės klasės egzempliorių.

Kitaip tariant, gyvatės klasėje bus tik vienasLivingThing“ klasės egzempliorius . Į Gyvūnų ir roplių klasės pasidalinti šį atvejį.

Tai išsprendžia anksčiau gautą kompiliavimo laiko klaidą. Iš abstrakčių klasių gautos klasės turi nepaisyti grynųjų virtualiųjų funkcijų, apibrėžtų pagrindinėje klasėje.

Tikiuosi, kad jums patiko ši daugybinio paveldėjimo apžvalga ir „Deimanto problema“.