When two or more classes serve as base classes in multiple inheritance, you want to choose a distinct name for each member function in order to avoid name ambiguity:
class AudioStreamer {//real-time sound playerpublic:void Play();void Stop();}; class VideoStreamer {//real-time video playerpublic:void Play();void Stop();}; class AudioVisual: public AudioStreamer, public VideoStreamer {/*_*/};AudioVisual player;player.play(); //error: is AudioStreamer::play() or VideoStreamer::play() to be invoked?
One way to overcome this ambiguity is to specify the full-qualified name of a member function:
Player.AudioStreamer::play(); //fine but tedious
However, a preferable solution is the use of distinct method names in the base classes:
class AudioStreamer {public:void au_Play(); }; class VideoStreamer {public:void vd_Play(); }; Player.au_play(); //now distinct: play sound