Többszörös öröklés C ++ - ban és a gyémántprobléma

Sok más objektumorientált programozási nyelvtől eltérően a C ++ lehetővé teszi több öröklődést.

A többszörös öröklés lehetővé teszi, hogy egy gyermekosztály több szülői osztálytól örököljön.

Először nagyon hasznos funkciónak tűnik. De a felhasználónak figyelembe kell vennie néhány getchát, miközben ezt a funkciót megvalósítja.

Az alábbi példákban néhány olyan forgatókönyvet tárgyalunk, amelyekre figyelni kell.

Egy egyszerű példával kezdjük, hogy elmagyarázzuk ezt a fogalmat a C ++ nyelven.

Ennek a kódnak a kimenete a következő:

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

A fenti példában van egy alaposztályunk, amelynek neve LivingThing . Az állatés a Hüllő osztályok örökölnek belőle. Csak az állatosztály felülírja a módszert breathe(). A Kígyó osztály örökli az Állat és a Hüllő osztályt. Ez felülírja a módszereiket. A fenti példában nincs probléma. A kódunk jól működik.

Most hozzáadunk egy kis bonyolultságot.

Mi van, ha a Hüllő osztály felülírja a breathe()módszert?

A Kígyó osztály nem tudná, melyik breathe()módszert hívja. Ez a „gyémántprobléma”.

Gyémántprobléma

Nézze meg az alábbi kódot. Olyan, mint a fenti példában szereplő kód, azzal a különbséggel, hogy felülírtuk a breathe()módszert a Hüllők osztályban.

Ha megpróbálja lefordítani a programot, akkor nem. Az alábbihoz hasonló hibaüzenetet fog bámulni.

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

A hiba a többszörös öröklés „gyémántproblémájának” köszönhető. A Kígyó osztály nem tudja, melyik breathe()módszert kell felhívni.

Az első példában csak az Animal osztály írta felül abreathe()módszer. A hüllő osztály nem. Ezért a Kígyó osztálynak nem volt nagyon nehéz kitalálni, hogy melyik breathe()módszert hívja. És a Kígyó osztály végül breathe()az Állatok osztály módszerét hívta .

A második példában a Snake osztály kétbreathe() módszert örököl . Az állat- és hüllőosztálybreathe() módszere . Mivel a Snake osztályban nem írtuk felül a módszert, kétértelműség van.breathe()

A C ++ számos hatékony funkcióval rendelkezik, például többszörös örökléssel. De nem szükséges, hogy használjuk az összes szolgáltatást.

Nem szeretem a többszörös öröklődést használni, és inkább a virtuális öröklést használom.

A virtuális öröklés megoldja a klasszikus „Gyémánt problémát”. Biztosítja, hogy a gyermekosztály csak egyetlen példányt kapjon a közös alaposztályból.

Más szavakkal, a Snake osztálynak csak egy példánya lesz a LivingThing osztályból. Az Animal és a Reptile osztályok osztoznak ebben a példában.

Ez megoldja a korábban kapott fordítási időhibát. Az absztrakt osztályokból származó osztályoknak felül kell írniuk az alaposztályban meghatározott tiszta virtuális függvényeket.

Remélem, tetszett Önnek a többszörös öröklés és a „Gyémántprobléma” áttekintése.