de Onur Tuna

Moștenirea multiplă în C ++ și problema Diamond

Mostenirea multipla in C si problema Diamond

Spre deosebire de multe alte limbaje de programare orientate pe obiecte, C ++ permite moștenirea multiplă.

Moștenirea multiplă permite unei clase copil să moștenească de la mai multe clase părinte.

La început, pare o caracteristică foarte utilă. Dar un utilizator trebuie să țină cont de câțiva gotchas în timp ce implementați această caracteristică.

În exemplele de mai jos, vom acoperi câteva scenarii de care trebuie să fim atenți.

Vom începe cu un exemplu simplu pentru a explica acest concept în C ++.

Ieșirea acestui cod este după cum urmează:

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

În exemplul de mai sus, avem o clasă de bază numită as Viețuitoare. Animal și Reptile clasele moștenesc din ea. Doar Animal clasa suprascrie metoda breathe(). Şarpe clasa moștenește de la Animal și Reptile clase. Înlocuiește metodele lor. În exemplul de mai sus, nu există nicio problemă. Codul nostru funcționează bine.

Acum, vom adăuga un pic de complexitate.

Ce-ar fi dacă Reptile clasa suprascrie breathe() metodă?

Şarpe clasa nu ar ști care breathe() metoda de apel. Aceasta este „Problema Diamantului”.

1611873844 323 Mostenirea multipla in C si problema Diamond

Diamond Problem

Uită-te la codul de mai jos. Este ca și codul din exemplul de mai sus, cu excepția faptului că am suprascris breathe() metoda în Reptile clasă.

Dacă încercați să compilați programul, acesta nu va fi. Vă veți uita la un mesaj de eroare precum cel de mai jos.

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

Eroarea se datorează „Problemei diamantului” a moștenirii multiple. Şarpe clasa nu știe care breathe() metoda de apel.

În primul exemplu, numai Animal clasa a suprascris breathe() metodă. Reptile clasa nu avea. Prin urmare, nu a fost foarte dificil pentru Şarpe clasă pentru a afla care breathe() metoda de apel. Si Şarpe clasa a ajuns să cheme breathe() metoda Animal clasă.

În al doilea exemplu, clasa Șarpe moștenește Două breathe() metode. breathe() metoda Animal și Reptile clasă. Din moment ce nu am trecut peste breathe() metoda în Şarpe clasă, există ambiguitate.

C ++ are multe caracteristici puternice, cum ar fi moștenirea multiplă. Dar nu este necesar să folosim toate caracteristicile pe care le oferă.

Nu prefer să folosesc moștenire și utilizare multiple virtual moștenire în schimb.

Moștenirea virtuală rezolvă clasicul „Diamond Problem”. Se asigură că clasa copil primește doar o singură instanță din clasa de bază comună.

Cu alte cuvinte, Şarpe clasa va avea numai unu exemplu de Viețuitoare clasă. Animal și Reptile clasele împărtășesc această instanță.

Aceasta rezolvă eroarea de timp de compilare pe care o primim mai devreme. Clasele derivate din clasele abstracte trebuie să anuleze funcțiile virtuale pure definite în clasa de bază.

Sper că v-a plăcut această prezentare generală a moștenirii multiple și a „Problemei diamantului”.