Prev Next Up Title Contents Index

Sekasijoitukset


Lopuksi tutkimme miten perittyjä olioita on mahdollista sijoittaa toisilleen. Esimerkkiin lisätään muutamia "seka"-sijoituksia:
	cGraafinenOlio *p;
	cPiste a(7,2),b; cYmpyra y(5,4,12); y.sytyta();
	...
	  b = a;         // OK!
	//a = y;         // Ei toimi jollei ole konstruktoria 
	                 // cPiste(cYmpyra)
	  p = &a;        // OK!  Tällä voidaan kiertää edell.
	 *p = y;         // "a = y".  Pisteelle ympyrän 
	                 // keskipiste ja näkyy (väärin!?).
	//y = b;         // Ei toimi jollei ole konstruktoria 
	                 // cYmpyra(cPiste);
	  p = &y;        // OK! => y = b
	 *p = b;         // Sijoistus laillinen koska    
	                 // caKuvio<cPiste
	                 // Sijoitetaan ne pisteen ominaisuud
	                 // jotka on graafisessa oliossa, eli 
	                 // kaikki.  p:n osoittama tyyppi ei            
	                 // muutu, eli säilyy ympyränä. Tosin 
	                 // "sammuu", mikä ei ole oikein. 

Click here for Picture

Kuva . Sekasijoitukset

Huomattakoon, että sijoituksissa "viipaloidaan" olioiden data- osat (attribuutit) toiseen olioon. vptria ei sijoiteta, eli olion luokka ei muutu. "Seka"-sijoituksissa osa attribuuteista menetetään ja tätä kutsutaan englanniksi nimellä slicing problem. Erityisesti ongelma ilmenee arvoparametrien välityksessä ja tässä onkin jälleen yksi syy välittää osoittimia joko suoraan tai käyttäen referenssejä (josta taas saattaa seurata muita ongelmia, mm. eri osoitteiden viitatessa samaan olioon = aliasing).

Huomautus: Hierarkiassa "uudempi" voidaan sijoittaa "vanhempaan":

	class cA ....
	class cB : public cA ...
	...
	 cA a; cB b;
	 a = b;  // OK! Eli aliluokan olio voidaan sijoitta yliluokkaan.  Slicing 
	 b = a;  // Ei sellaisenaan mielekäs, koska osa attribuutteja jää ilman arvoa.

Tehtävä 1.19 Miksi näkyvyyden muuttuminen on väärin

Miksi edellä on sanottu, että näkyvyyden muuttuminen on väärin sijoituksissa *p=y ja *p=b?


Prev Next Up Title Contents Index