Virtual Inheritance - The Problem

The Problem

Consider the following class hierarchy.

class Animal { public: virtual void eat; }; class Mammal : public Animal { public: virtual void breathe; }; class WingedAnimal : public Animal { public: virtual void flap; }; // A bat is a winged mammal class Bat : public Mammal, public WingedAnimal { }; Bat bat;

As declared above, a call to bat.eat is ambiguous because there are two Animal (indirect) base classes in Bat, so any Bat object has two different Animal base class subobjects. So an attempt to directly bind a reference to the Animal subobject of a Bat object would fail, since the binding is inherently ambiguous:

Bat b; Animal &a = b; // error: which Animal subobject should a Bat cast into, // a Mammal::Animal or a WingedAnimal::Animal?

To disambiguate, one would have to explicitly convert bat to either base class subobject:

Bat b; Animal &mammal = static_cast (b); Animal &winged = static_cast (b);

In order to call eat, the same disambiguation is needed: static_cast(bat).eat or static_cast(bat).eat.

In this case, the double inheritance of Animal is probably unwanted, as we want to model that the relation (Bat is an Animal) exists only once; that a Bat is a Mammal and is a WingedAnimal does not imply that it is an Animal twice: an Animal base class corresponds to a contract that Bat implements (the "is a" relationship above really means "implements the requirements of"), and a Bat only implements the Animal contract once. The real world meaning of "is a only once" is that Bat should have only one way of implementing eat, not two different ways, depending on whether the Mammal view of the Bat is eating, or the WingedAnimal view of the Bat. (In the first code example we see that eat is not overridden in either Mammal or WingedAnimal, so the two Animal subobjects will actually behave the same, but this is just a degenerate case, and that does not make a difference from the C++ point of view.)

This situation is sometimes referred to as diamond inheritance (see Diamond problem) because the inheritance diagram is in the shape of a diamond. Virtual inheritance can help to solve this problem.

Read more about this topic:  Virtual Inheritance

Famous quotes containing the word problem:

    Like the effects of industrial pollution ... the AIDS crisis is evidence of a world in which nothing important is regional, local, limited; in which everything that can circulate does, and every problem is, or is destined to become, worldwide.
    Susan Sontag (b. 1933)

    The family environment in which your children are growing up is different from that in which you grew up. The decisions our parents made and the strategies they used were developed in a different context from what we face today, even if the “content” of the problem is the same. It is a mistake to think that our own experience as children and adolescents will give us all we need to help our children. The rules of the game have changed.
    Lawrence Kutner (20th century)