The
need for multiple inheritance
in
Persist2.cpp
is contrived, based on the concept that you don’t have control of some of
the code in the project. Upon examination of the example, you can see that MI
can be easily avoided by using member objects of type
Data,
and putting the virtual
read( )and
write( )
members inside
Data
or
WData1
and
WData2
rather
than in a separate class. There are many situations like this one where
multiple inheritance may be avoided; the language feature is included for
unusual, special-case situations that would otherwise be difficult or
impossible to handle. But when the question of whether to use multiple
inheritance comes up, you should ask two questions:
Do
I need to show the public interfaces of both these classes, or could one class
be embedded with some of its interface produced with member functions in the
new class?
Do
I need to upcast to both of the base classes? (This applies when you have more
than two base classes, of course.)
If
you can’t answer “no” to both questions, you can avoid using
MI and should probably do so.
One
situation to watch for is when one class only needs to be upcast as a function
argument. In that case, the class can be embedded and an automatic type
conversion operator provided in your new class to produce a reference to the
embedded object. Any time you use an object of your new class as an argument to
a function that expects the embedded object, the type conversion operator is
used. However, type conversion can’t be used for normal member selection;
that requires inheritance.