Prev Next Up Title Contents Index

Sama perusluokka (base class) = pahin ongelma

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 
Esimerkkimme kantaluokilla perimähierarkiasta tulisi seuraava:
Click here for Picture 

Kuva . Moniperinnän ongelma

Ohjelmana:

multi4.cpp - moniperinnän ongelma

	/* 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?


Prev Next Up Title Contents Index