Ongelmia tulee lähinnä, mikäli suora moniperintä on sellainen, että molemmilla (tai vähintään kahdella) perittävillä on sama kantaluokka. Haluttaisiin vaikkapa piirtää seuraavanlaisia objekteja:
Click here for Picture
Click here for Picture
/* MULTI4.CPP - moniperinnän ongelmia */
#include <stdio.h>
//----------------------------------------------------------------------------
class caKuvio {...
class caKuvioJollaSade : public caKuvio {...
class cPiste : public caKuvio {...
class cYmpyra : public caKuvioJollaSade {...
//----------------------------------------------------------------------------
class cNelio : public caKuvioJollaSade {
public:
cNelio(int ix=0, int iy=0, int ir=1) : caKuvioJollaSade(ix,iy,ir) {}
virtual ~cNelio() { sammuta(); }
virtual void piirra() const { tulosta("Neliö"); printf("\n"); }
}; // cNelio
//----------------------------------------------------------------------------
class cYmpyranelio: public cYmpyra, public cNelio {
public:
cYmpyranelio(int ix=0, int iy=0, int ir = 1, int is = 2)
: cYmpyra(ix,iy,ir), cNelio(ix,iy,is) { }
void piirra() const { cYmpyra::piirra(); cNelio::piirra(); }
~cYmpyranelio() { }
}; // cYmpyranelio
//----------------------------------------------------------------------------
int main(void)
{
printf("\n----------------------------------------------------------\n");
cYmpyranelio yn(1,2,3,4);
yn.sytyta(); // Ympyrän vain Neliön sytytä?
return 0;
}
Ongelmana on siis kaksinkertainen ilmentymä säteelliselle oliolle.
Esimerkiksi mitä tarkoittaa sytyta. Ympyrän vai neliön
sytyttämistä. Sama koskee sammuta- metodia. Osittain
ongelmaa voitaisiin kiertää lisäämällä
ympyräneliölle jäsenfunktio:
void sytyta() { cYmpyra::sytyta(); }Näillä
muutoksilla ohjelma voidaan kääntää ja ajaa, mutta se
toimii väärin. Nimittäin neliötä ei sytytetä,
vaikka sen piirtämistä kutsutaan! Lisäksi kantaluokassa
sytyta ei ollut virtuaalinen, eli tämä luokka ei toimi jos
siihen on polymorfinen osoitin! Eli luokkahierarkia olisi pitänyt
miettiä paremmin. Mutta miten?