Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Luokkien väliset koostesuhteet
Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä.
Muutamia käsitteitätMyn1 Muutamia käsitteitä •Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan,
Ict1td002: Ohjelmointitaito Kertaus Osio 2 - luokat - ilmentymät - viittaus- ja arvomuuttuja - ilmentymien taulukointi HAAGA-HELIA IltaTiko.
Julkaisukielet ja - tekniikat tMyn1 Julkaisukielet ja -tekniikat •Verkko-ohjelmointi voidaan jakaa kahteen osaan: asiakaspuolen ja palvelinpuolen ohjelmointiin.
Olio-ohjelmointi. Mitä olio-ohjelmointi on ?  Pyritään mallintamaan jotain reaalimaailman kohdetta tietokoneohjelman avulla  Olio on luokan ilmentymä.
C-kieli ja dynaaminen muistin varaus
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
13. Pakkaukset.
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Ohjelman jakaminen useampaan tiedostoon Olio-ohjelmointi (C++) KYAMK, Jarkko Ansamäki 2001.
Olio-ohjelmoinnin perusteet luento 3
OLIO-OHJELMOINTI PERUSTEET PERUSTIETOTYYPIT
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
Luokkien löytyminen käytännössä tMyn1 Luokkien löytyminen käytännössä Kun aletaan ratkaista elävän elämän ohjelmointitehtäviä, niin ensimmäisten asioiden.
9. Periytyminen Javassa.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
Sami Jantunen LTY/Tietotekniikan osasto
Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
© Jukka Harju, Jukka Juslin
Tekstitiedostosta lukeminen tMyn1 Tekstitiedostosta lukeminen Tiedosto voidaan avata pelkästään lukemista varten tai kirjoittamista ja lukemista varten.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen.
Luokan määrittely class-määreellä tMyn1 Luokan määrittely class-määreellä Luokan määrittely tarkoittaa luokan tietojäsenten esittelyä ja jäsenfunktioiden.
Lueteltu tyyppitMyn1 Lueteltu tyyppi Lueteltu tyyppi on tietotyyppi, jonka arvot luetellaan erikseen tyypin määrittelyn yhteydessä. Lueteltua tietotyyppiä.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Ohjelman keskeytys virhetilanteessa tMyn1 Ohjelman keskeytys virhetilanteessa Poikkeustilanteet voidaan ryhmitellä logiikkavirheisiin ja muihin ajonaikaisiin.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
Poikkeustenkäsittely- lohkot tMyn1 Poikkeustenkäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw.
Oman poikkeus- käsittelyfunktion tMyn1 Oman poikkeuskäsittelyfunktion määrittely Funktion tulisi muodostaa ainoastaan sellaisia poikkeuksia, jotka on sallittu.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Tekstitiedostoon kirjoittaminen tMyn1 Tekstitiedostoon kirjoittaminen Tiedostoja käsitellään ohjelmassa tiedosto-olion avulla. Tiedosto-olion luokka sisältää.
Ohjelmointi työtä n. 16 h/vko onnistumista työtä n. 16 h/vko onnistumista #include int main(void) { std::cout
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Kantaluokan määrittely tMyn1 Kantaluokan määrittely Perinnän käyttöön liittyvät varatut sanat private, protected, public, final ja abstract. Ne tarkoittavat.
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
Osoittimen määrittely ja alustus tMyn1 Osoittimen määrittely ja alustus Osoitin (pointer) on muuttuja, joka voi sisältää keskusmuistiosoitteen. Osoitinmuuttujan.
Olio-ohjelmoinnin perusteet luento 5 Päivi Ovaska LTY/Tietotekniikan osasto.
11. Rajapinnat.
Poikkeustenkäsittelylohkot try-catch
Kantaluokan määrittely
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Rajapintaluokat Rajapintaluokka luettelee metodit, joille tulee löytyä toteutus asianomaisen rajapinnan toteuttavista luokista. Rajapintaluokka on siis.
Kantaluokan määrittely
Luokan määrittely class-määreellä
Muutamia käsitteitä Perintä (inheritance) on luokkien välinen suhde, jossa johdettu luokka (subclass, derived class) perii kantaluokan, perusluokan (superclass,
13. Pakkaukset.
7. Näytölle tulostaminen
3. Attribuutit.
13. Pakkaukset.
4. Luokan testaus ja käyttö olion kautta
Esityksen transkriptio:

Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion oletustoteutus kirjoitetaan monimuotoiseen kantaluokkaan ja oletustoteutuksen korvaavat toteutusratkaisut kirjoitetaan tarvittaessa monimuotoisesta kantaluokasta johdettuihin luokkiin.

Virtuaaliset jäsenfunktiot tMyn2 Virtuaalisen jäsenfunktion esittely: class kantaLuokka { public: virtual jasenFunktio(); … };

Virtuaaliset jäsenfunktiot tMyn3 Varattu sana virtual kertoo, että luokka sisältää jäsenfunktion oletustoteutuksen. Johdetuissa luokissa voi olla useita oletustoteutuksen korvaavia toteutuksia. Johdettuun luokkaan toteutettavan (override) jäsenfunktion esittelyn on vastattava monimuotoisessa kantaluokassa esiteltyä virtuaalista jäsenfunktiota. Siis: –nimen on oltava sama kuin kantaluokassakin. –parametrien lukumäärän ja tyyppien on oltava samat kuin kantaluokassa – ja samassa järjestyksessä. –jäsenfunktion tyypin on oltava sama kuin kantaluokassa.

Virtuaaliset jäsenfunktiot tMyn4 Oletustoteutuksen korvaaminen johdetussa luokassa: class johdettuLuokka:public kantaLuokka { public: virtual jasenFunktio(); … }; //jasenFunktion toteutus

Virtuaaliset jäsenfunktiot tMyn5 Varattu sana virtual siis lisätään jäsenfunktion eteen luokan toteutuksen yhteydessä. Kun jäsenfunktion runko toteutetaan, niin silloin ei enää lisätä sanaa virtual. Kun kantaluokassa jokin jäsenfunktio määritellään virtual-tyyppiseksi, niin vastaavasti kaikki johdetuissa luokissa korvatut (redefine->override) funktiot muuttuvat virtual-tyyppisiksi. Symmetriasyistä (ja selvyyden vuoksi) tällainen johdetun luokan jäsenfunktio voidaan/kannattanee merkitä virtual- tyyppiseksi kyseisen luokan määrittelyssä.

Virtuaaliset jäsenfunktiot tMyn6 Virtuaalista jäsenfunktiota käytetään viittaamalla epäsuorasti määriteltyyn olioon. Epäsuoralla viittauksella tarkoitetaan tunnusta, joka on osoitin tai viittaus olioon. Dynaamista sidontaa ei siis tapahdu käytettäessä automaattista tunnusta. Dynaaminen sidonta toteutetaan kantaluokan osoitinta käyttäen: kantaLuokka* tunnus=&automaattinenOlio; tunnus->jasenFunktio();

Virtuaaliset jäsenfunktiot tMyn7 kantaLuokka* tunnus=dynaaminenOlio; tunnus->jasenFunktio(); Olio voi olla automaattinen tai dynaaminen. Otetaan esimerkkinä äskeinen ohjelma. Tarvittava muutos on pieni!! Huom! Tehdään vielä se muutos tuohon edelliseen esimerkkiin (joka oli käytössä luvussa Monimuotoinen luokka), että muutetaan tietojäsenet dynaamisiksi, jotta nähdään hajotinten toimivuus (tai toimimattomuus). Aluksi operoidaan automaattisen olion kanssa:

Virtuaaliset jäsenfunktiot tMyn8 // Laatikko.h #ifndef LAATIKKO_H #define LAATIKKO_H class Laatikko { public: Laatikko(); void AsetaLeveys(); void AsetaSyvyys(); void AsetaKorkeus(); Laatikko(double, double, double); void AsetaLeveys(double); void AsetaSyvyys(double); void AsetaKorkeus(double); ~Laatikko(); void HaeTilavuus(); virtual double LaskeTilavuus();

Virtuaaliset jäsenfunktiot tMyn9 protected: double* mp_leveys; double* mp_syvyys; double* mp_korkeus; }; #endif

Virtuaaliset jäsenfunktiot tMyn10 // Pahvilaatikko.h #ifndef PAHVILAATIKKO_H #define PAHVILAATIKKO_H #include "Laatikko.h" class Pahvilaatikko: public Laatikko { public: Pahvilaatikko(); void AsetaPaino(); Pahvilaatikko(double); void AsetaPaino(double); Pahvilaatikko(double, double, double, double); ~Pahvilaatikko(); virtual double LaskeTilavuus(); private: double* mp_paino; }; #endif

Virtuaaliset jäsenfunktiot tMyn11 // Laatikko.cpp #include "stdafx.h" #include #include "Laatikko.h" using namespace System; using namespace std; Laatikko::Laatikko() { cout<<"Kantaluokan oletusmuodostin, olio "<<this<<endl; mp_leveys=new double; AsetaLeveys(); mp_syvyys=new double; AsetaSyvyys(); mp_korkeus=new double; AsetaKorkeus(); }

Virtuaaliset jäsenfunktiot tMyn12 void Laatikko::AsetaLeveys() { cout<<"Anna leveys: "; cin>>*mp_leveys; cin.get(); } void Laatikko::AsetaSyvyys() { cout<<"Anna syvyys: "; cin>>*mp_syvyys; cin.get(); } void Laatikko::AsetaKorkeus() { cout<<"Anna korkeus: "; cin>>*mp_korkeus; cin.get(); }

Virtuaaliset jäsenfunktiot tMyn13 Laatikko::Laatikko(double leveys, double syvyys, double korkeus) { cout<<"Kantaluokan 3 param. muodostin, olio "<<this<<endl; mp_leveys=new double; AsetaLeveys(leveys); mp_syvyys=new double; AsetaSyvyys(syvyys); mp_korkeus=new double; AsetaKorkeus(korkeus); } void Laatikko::AsetaLeveys(double leveys) { *mp_leveys=leveys; } void Laatikko::AsetaSyvyys(double syvyys) { *mp_syvyys=syvyys; }

Virtuaaliset jäsenfunktiot tMyn14 void Laatikko::AsetaKorkeus(double korkeus) { *mp_korkeus=korkeus; } Laatikko::~Laatikko() { cout<<"Kantaluokan hajotin, olio "<<this<<endl; delete mp_leveys; delete mp_syvyys; delete mp_korkeus; } void Laatikko::HaeTilavuus() { cout<<"Tilavuus, olio "<<this<<" on "<<LaskeTilavuus()<<endl; } double Laatikko::LaskeTilavuus() { return *mp_leveys*(*mp_syvyys)*(*mp_korkeus); }

Virtuaaliset jäsenfunktiot tMyn15 // Pahvilaatikko.cpp #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; Pahvilaatikko::Pahvilaatikko() :Laatikko() { cout<<"Johdetun luokan oletusmuodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(); }

Virtuaaliset jäsenfunktiot tMyn16 void Pahvilaatikko::AsetaPaino() { cout<<"Anna paino: "; cin>>*mp_paino; cin.get(); } Pahvilaatikko::Pahvilaatikko(double paino) :Laatikko() { cout<<"Johdetun luokan 1 param. muodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(paino); } void Pahvilaatikko::AsetaPaino(double paino) { *mp_paino=paino; }

Virtuaaliset jäsenfunktiot tMyn17 Pahvilaatikko::Pahvilaatikko(double leveys, double syvyys, double korkeus, double paino) :Laatikko(leveys, syvyys, korkeus) { cout<<"Johdetun luokan 4 param. muodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(paino); } Pahvilaatikko::~Pahvilaatikko() { cout<<"Johdetun luokan hajotin, olio "<<this<<endl; delete mp_paino; } double Pahvilaatikko::LaskeTilavuus() { return 0.85*(*mp_leveys)*(*mp_syvyys)*(*mp_korkeus); }

Virtuaaliset jäsenfunktiot tMyn18 // moni1Main.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Laatikko eka=Laatikko(1.1, 2.2, 3.3); Pahvilaatikko toka=Pahvilaatikko(1.1, 2.2, 3.3, 68.9); Laatikko* osoitin=&eka; osoitin->HaeTilavuus(); osoitin=&toka; osoitin->HaeTilavuus(); return 0; }

Virtuaaliset jäsenfunktiot tMyn19

Virtuaaliset jäsenfunktiot tMyn20 Seuraavaksi muuten sama, mutta kokeillaan dynaamisilla olioilla:

Virtuaaliset jäsenfunktiot tMyn21 //Sama kuin edellisessä esimerkissä … // moni2Main.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Laatikko* eka=new Laatikko(1.1, 2.2, 3.3); Pahvilaatikko* toka=new Pahvilaatikko(1.1, 2.2, 3.3, 68.9); Laatikko* osoitin=eka; osoitin->HaeTilavuus(); osoitin=toka; osoitin->HaeTilavuus();

Virtuaaliset jäsenfunktiot tMyn22 Laatikko* kolmas=new Pahvilaatikko(1.1, 2.2, 3.3, 79.8); osoitin=kolmas; osoitin->HaeTilavuus(); delete eka; delete toka; delete kolmas; return 0; }

Virtuaaliset jäsenfunktiot tMyn23

Virtuaaliset jäsenfunktiot tMyn24 Edellisestä diasta huomataan, että ihan kaikki ei ole vielä kunnossa! Jos kantaluokan hajotin ei ole virtuaalinen ja ohjelma käsittelee johdetun luokan olioita monimuotoisen kantaluokan tyyppisellä osoittimella (olio kolmas), järjestelmä kutsuu olion tunnuksen tilanvapautuksen yhteydessä ainoastaan kantaluokan hajotinta. Olion määrittelyluokan hajotin (johdetun luokan hajotin) jää kutsumatta ja mahdolliset dynaamiset tietojäsenet jäävät niin muodoin vapauttamatta. Tehdään siis edelliseen yksi muutos: esitellään kantaluokan hajotin varatulla sanalla virtual.

Virtuaaliset jäsenfunktiot tMyn25 Nyt kun kantaluokassa on virtuaalinen hajotin, niin johdetun luokan hajotin muuttuu myös virtuaaliseksi. Johdetun luokan määrittelyyn voidaan myös lisätä tuo varattu sama virtual hajottimen eteen. Kullakin luokalla on luokkansa niminen hajotin. Tämä virtuaalinen hajotin on siis jonkin tyyppinen erikoistapaus C++:ssa.

Virtuaaliset jäsenfunktiot tMyn26 // Laatikko.h #ifndef LAATIKKO_H #define LAATIKKO_H class Laatikko { public: Laatikko(); void AsetaLeveys(); void AsetaSyvyys(); void AsetaKorkeus(); Laatikko(double, double, double); void AsetaLeveys(double); void AsetaSyvyys(double); void AsetaKorkeus(double); virtual ~Laatikko(); void HaeTilavuus(); virtual double LaskeTilavuus();

Virtuaaliset jäsenfunktiot tMyn27 protected: double* mp_leveys; double* mp_syvyys; double* mp_korkeus; }; #endif

Virtuaaliset jäsenfunktiot tMyn28 // Pahvilaatikko.h #ifndef PAHVILAATIKKO_H #define PAHVILAATIKKO_H #include "Laatikko.h" class Pahvilaatikko: public Laatikko { public: Pahvilaatikko(); void AsetaPaino(); Pahvilaatikko(double); void AsetaPaino(double); Pahvilaatikko(double, double, double, double); virtual ~Pahvilaatikko(); virtual double LaskeTilavuus(); private: double* mp_paino; }; #endif

Virtuaaliset jäsenfunktiot tMyn29 // Laatikko.cpp #include "stdafx.h" #include #include "Laatikko.h" using namespace System; using namespace std; Laatikko::Laatikko() { cout<<"Kantaluokan oletusmuodostin, olio "<<this<<endl; mp_leveys=new double; AsetaLeveys(); mp_syvyys=new double; AsetaSyvyys(); mp_korkeus=new double; AsetaKorkeus(); }

Virtuaaliset jäsenfunktiot tMyn30 void Laatikko::AsetaLeveys() { cout<<"Anna leveys: "; cin>>*mp_leveys; cin.get(); } void Laatikko::AsetaSyvyys() { cout<<"Anna syvyys: "; cin>>*mp_syvyys; cin.get(); } void Laatikko::AsetaKorkeus() { cout<<"Anna korkeus: "; cin>>*mp_korkeus; cin.get(); }

Virtuaaliset jäsenfunktiot tMyn31 Laatikko::Laatikko(double leveys, double syvyys, double korkeus) { cout<<"Kantaluokan 3 param. muodostin, olio "<<this<<endl; mp_leveys=new double; AsetaLeveys(leveys); mp_syvyys=new double; AsetaSyvyys(syvyys); mp_korkeus=new double; AsetaKorkeus(korkeus); } void Laatikko::AsetaLeveys(double leveys) { *mp_leveys=leveys; } void Laatikko::AsetaSyvyys(double syvyys) { *mp_syvyys=syvyys; }

Virtuaaliset jäsenfunktiot tMyn32 void Laatikko::AsetaKorkeus(double korkeus) { *mp_korkeus=korkeus; } Laatikko::~Laatikko() { cout<<"Kantaluokan hajotin, olio "<<this<<endl; delete mp_leveys; delete mp_syvyys; delete mp_korkeus; } void Laatikko::HaeTilavuus() { cout<<"Tilavuus, olio "<<this<<" on "<<LaskeTilavuus()<<endl; } double Laatikko::LaskeTilavuus() { return *mp_leveys*(*mp_syvyys)*(*mp_korkeus); }

Virtuaaliset jäsenfunktiot tMyn33 // Pahvilaatikko.cpp #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; Pahvilaatikko::Pahvilaatikko() :Laatikko() { cout<<"Johdetun luokan oletusmuodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(); }

Virtuaaliset jäsenfunktiot tMyn34 void Pahvilaatikko::AsetaPaino() { cout<<"Anna paino: "; cin>>*mp_paino; cin.get(); } Pahvilaatikko::Pahvilaatikko(double paino) :Laatikko() { cout<<"Johdetun luokan 1 param. muodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(paino); } void Pahvilaatikko::AsetaPaino(double paino) { *mp_paino=paino; }

Virtuaaliset jäsenfunktiot tMyn35 Pahvilaatikko::Pahvilaatikko(double leveys, double syvyys, double korkeus, double paino) :Laatikko(leveys, syvyys, korkeus) { cout<<"Johdetun luokan 4 param. muodostin, olio "<<this<<endl; mp_paino=new double; AsetaPaino(paino); } Pahvilaatikko::~Pahvilaatikko() { cout<<"Johdetun luokan hajotin, olio "<<this<<endl; delete mp_paino; } double Pahvilaatikko::LaskeTilavuus() { return 0.85*(*mp_leveys)*(*mp_syvyys)*(*mp_korkeus); }

Virtuaaliset jäsenfunktiot tMyn36 // moni2aMain.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Laatikko* eka=new Laatikko(1.1, 2.2, 3.3); Pahvilaatikko* toka=new Pahvilaatikko(1.1, 2.2, 3.3, 68.9); Laatikko* osoitin=eka; osoitin->HaeTilavuus(); osoitin=toka; osoitin->HaeTilavuus();

Virtuaaliset jäsenfunktiot tMyn37 Laatikko* kolmas=new Pahvilaatikko(1.1, 2.2, 3.3, 79.8); osoitin=kolmas; osoitin->HaeTilavuus(); delete eka; delete toka; delete kolmas; return 0; }

Virtuaaliset jäsenfunktiot tMyn38

Virtuaaliset jäsenfunktiot tMyn39 Yhteenveto dynaamisesta sidonnasta Late binding, dynamic binding. Olion käyttäytymistavan määrää olion määrittelyluokkaan toteutettu jäsenfunktio. Monella tapaa toteutettavissa olevaa jäsenfunktiota kutsutaan virtuaaliseksi jäsenfunktioksi. Virtuaalinen jäsenfunktio on funktio, josta löytyy useita toteutusratkaisuja ja jonka kutsua vastaavan toteutustavan järjestelmä etsii olion määrittelyluokasta ohjelman suorituksen aikana.

Virtuaaliset jäsenfunktiot tMyn40 Kääntäjä ei voi etukäteen (=staattisesti, käännösvaiheessa) päätellä olion määrittelyluokkaa, koska ohjelmassa esitelty oliotunnus (osoitinmuuttuja tai viittaus) voi viitata eri aikoina ohjelmaa eri olioihin. Oliot voivat olla eri luokista. Virtuaalista jäsenfunktiota tulee käyttää ainoastaan viittaamalla epäsuorasti määriteltyyn olioon (siis käyttää niin, että sidonta tapahtuu ajonaikaisesti). Epäsuoralla viittauksella tarkoitetaan oliotunnusta, joka on osoitin tai viittaus olioon. Itse olio voi olla automaattinen tai dynaaminen.

Virtuaaliset jäsenfunktiot tMyn41 Polymorfismi on prosessi, jonka avulla saavutetaan yhteinen liittymä kahdelle tai useammalle samankaltaiselle (teknisesti erilaiselle) toiminnolle. Siis toteutetaan yksi liittymä, monta metodia filosofia. Polymorfismin avulla voidaan huomattavasti yksinkertaistaa monimutkaisia järjestelmiä. Käytetään yhtä hyvin määriteltyä liittymää ja suoritetaan erilaisia mutta yhteenkuuluvia toiminteita, jolloin keinotekoinen kompleksisuus katoaa.

Virtuaaliset jäsenfunktiot tMyn42 Syötetään lasta, syötetään jääkiekossa, syötetään jalkapallossa, syötetään paperia kirjoittimeen, jne: kaikki ovat syöttämisiä, mutta tapauskohtaisesti toiminta voi olla hyvinkin erilaista. Polymorfismin avulla ohjelmat tulevat helpommin ymmärrettäviksi ja ylläpidettäviksi. Tarvitsee muistaa vähemmän, kun samankaltaisilla toimenpiteillä on samanlainen liittymä.

Virtuaaliset jäsenfunktiot tMyn43 Kun virtuaalifunktiota kutsutaan kantaluokan osoittimen avulla, ohjelman on pääteltävä ajon aikana, minkä tyyppistä oliota kantaluokan osoitin osoittaa ja sitten valittava kyseiseen tyyppiin liittyvä virtuaalifunktion versio. Päähyöty myöhaisestä sidonnasta on ajonaikaisessa joustavuudessa. Ohjelma voi käsitellä suurta joukkoa satunnaisia tapahtumia ilman valtavaa ehtojen käsittelykoodia (if... elseif... elseif...). Päähaitta on funktiokutsuihin liittyvässä järjestelmän tuottamassa lisäkuormassa. Tällaiset funktiokutsut ovat yleensä hitaampia kuin aikaisen sidonnan kutsut.

Virtuaaliset jäsenfunktiot tMyn44 Käyttöjärjestelmissä kuten Windows järjestelmän liittymä ohjelmiin tapahtuu sanomien välityksellä. Näitä sanomia generoituu satunnaisesti riippuen käyttäjän ja järjestelmän toiminnasta. Ohjelman on vastattava saamiinsa sanomiin. Kuten arvata saattaa ajonaikaisesta polymorfismista on hyötyä ohjelmissa, jotka on tehty tämän tyyppisiin järjestelmiin.