When
you inherit from a base class, you get a copy of all the data members of that
base class in your derived class. This copy is referred to as a
subobject.
If you multiply inherit from class
d1
and class
d2
into class
mi,
class
mi
contains one subobject of
d1
and one of
d2.
So your
mi
object
looks like this:
Now
consider what happens if
d1
and
d2
both inherit from the same base class, called
Base:
In
the above diagram, both
d1
and
d2
contain
a subobject of
Base,
so
mi
contains
two
subobjects of
Base.
Because of the path produced in the diagram, this is sometimes called a
“diamond” in the inheritance hierarchy. Without diamonds,
multiple inheritance is quite straightforward, but as soon as a diamond
appears, trouble starts because you have duplicate subobjects in your new
class. This takes up extra space, which may or may not be a problem depending
on your design. But it also introduces an ambiguity.