Prev Next Up Title Contents Index

Virtuaalinen perintä

Nyt erityinen ongelma on kaksi erillistä nakyy- attribuuttia. Samoin kaksi erillistä keskipistettä. Jos haluamme, että kummallakin on sama keskipiste ja näkyvyys sekä säde, täytyy cSateellinenOlio periä ympyrään ja neliöön virtuaalisena (inherited base as virtual):

multi5.cpp - virtuaalinen perintä

	/* MULTI5.CPP */
	...
	class cYmpyra : virtual public caKuvioJollaSade {...
	class cNelio : virtual public caKuvioJollaSade {...
Nyt ympyräneliölle tulee vain yksi yhteinen keskipiste, säde ja näkyvyys. Ongelmaksi tulee kuitenkin se, että pisteelle kutsutaan nyt oletusmuodostajaa caKuvioJollaSade(), koska kutsu tehdään vain kerran. Siis jos ympyräneliölle halutaan alustaa keskipiste, on vielä ympyräneliön muodostajaa ja hajottajaa muokattava:
	class cYmpyranelio: public cYmpyra, public cNelio {
	public:
	  cYmpyranelio(int ix=0, int iy=0, int ir = 1, int is = 2)
	    : caKuvioJollaSade(ix,iy,ir), cYmpyra(ix,iy,ir), cNelio(ix,iy,is) { }
	  void piirra() const {  cYmpyra::piirra(); cNelio::piirra();      }
	  ~cYmpyranelio()     {  sammuta();                                }
	};
Ilman virtual-määritystä muodostajien ja hajottajien kutsut olisivat (ku = kuvio, ks = kuvio jolla säde):
	muodostajat: ku ks ympyra ku ks nelio ympyranelio
	hajottajat:  ympyranelio nelio ks ku ympyra ks ku
Virtual-määrityksen kanssa kutsut ovat vastaavasti:
	muodostajat: ku ks ympyra nelio ympyranelio
	hajottajat:  ympyranelio nelio ympyra ks ku
Edellä saatiin virtuaalisella perinnällä toimiva rakenne, mutta entäpä jos halutaisiinkin oma säde sekä neliölle että ympyrälle?


Prev Next Up Title Contents Index