Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.

Samankaltaiset esitykset


Esitys aiheesta: "Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka."— Esityksen transkriptio:

1 Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka tarkoittaa luokkaa, jonka mukaan olion tietojäsenten tilanvaraus tapahtuu. Esittelyluokka voi olla joko määrittelyluokka tai jokin määrittelyluokan kantaluokka. Johdetun luokan olion määrittelyluokka on aina kyseinen johdettu luokka. Johdetun luokan oliolle varattavan tilan koko määräytyy kantaluokassa ja johdetussa luokassa määriteltyjen tietojäsenten yhteenlasketusta tavumäärästä.

2 Johdetun luokan olion esittely... tMyn2 Johdetun luokan oliolla on siis kaikki kantaluokassa ja johdetussa luokassa määritellyt tiedot. Johdetun luokan automaattisen olion esittely ja määrittely: johdettuLuokka olio; Dynaamisen olion esittely ja määrittely. Esittely- ja määrittelyluokka on sama: johdettuLuokka* olio=new johdettuLuokka;

3 Johdetun luokan olion esittely... tMyn3 Dynaamisen olion esittely ja määrittely. Esittely- ja määrittelyluokka poikkeaa toisistaan. Olion tunnus on esitelty kantaluokkaan ja olio on määritelty johdettuun luokkaan. Tämä ei toimi oikein (johdetun luokan hajottimen kutsu) ilman monimuotoisuutta: Kantaluokka* olio = new johdettuLuokka;

4 Johdetun luokan olion esittely... tMyn4 Johdettu luokka voi erikoistua lisäämällä uusia tietojäseniä tai jäsenfunktioita ja/tai korvaamalla (redefined functions) kantaluokan jäsenfunktioiden toteutuksia. Termi redefinition, korvaaminen liittyy nimenomaan perintään. Kun saman tapaista toimintaa harjoitetaan monimuotoisuuden yhteydessä, niin terminä on silloin override. Perinnän yhteydessä kantaluokan jäsenfunktion toteutusta voidaan haluta hieman muuttaa. Silloin johdetun luokan määrittelyyn on lisättävä täsmälleen sama otsikkotieto kyseisestä jäsenfunktiosta kuin mitä on esitetty kantaluokan määrittelyssä. Toteutus sitten eroaa alkuperäisestä.

5 Johdetun luokan olion esittely... tMyn5 Jos johdetun luokan määrittelyssä olisi saman niminen jäsenfunktio kuin mitä on kantaluokassa, mutta tällä johdetun luokan jäsenfunktiolla olisi eri määrä tai erilaisia parametreja kuin mitä vastaavan näköisellä kantaluokan jäsenfunktiolla, niin silloin puhuttaisiin totuttuun tapaan funktion kuormittamisesta (overload/overloading).

6 Johdetun luokan olion esittely... tMyn6 Redefining an Inherited Function: A derived class inherits all the member functions (and member variables as well) that belong to the base class. However, if a derived class requires a different implementation for an inherited member function, the function may be redifened in the derived class.

7 Johdetun luokan olion esittely... tMyn7 Redefining an Inherited Function: When a member function is redefined, you must list its declaration and definition in the definition of the derived class even though the declaration is the same as in the base class. If you do not wish to redefine a member function that is inherited from the base class, then it is not listed in the definition of the derived class.

8 Johdetun luokan olion esittely... tMyn8 Seuraavassa esimerkissä on kuormitettu (overload) johdetun luokan muodostinta sekä korvattu (redefine) kantaluokan jäsenfunktio HaeNaytolle() johdetussa luokassa toisenlaisella toteutuksella (mutta siis otsikkotiedoiltaan ne ovat täsmälleen identtisiä). Lisäksi johdetussa luokassa on myös kuormitettu saman luokan jäsenfunktiota AsetaJArvo(). HUOM! Olisi voitu myös toteuttaa kantaluokkaan jäsenfunktio AsetaArvo(), ja korvata se (redefine) johdetussa luokassa toisenlaisella toteutuksella, mutta siinä tapauksessa johdetun luokan olemassaolevan olion tietojäsentä ’kanta’ ei voitaisi enää muuttaa, vaikka ehkä haluttaisiinkin. Miksi?

9 Johdetun luokan olion esittely... tMyn9 Luodaan johdettuun luokkaan sekä automaattinen että dynaaminen olio. Tässä vaiheessa kantaluokassa on vain oletusmuodostin.

10 Johdetun luokan olion esittely... tMyn10 // Laatikko.h #ifndef LAATIKKO_H #define LAATIKKO_H class Laatikko { public: Laatikko(); void AsetaKArvo(); ~Laatikko(); void HaeNaytolle(); protected: int* mp_kanta; }; #endif

11 Johdetun luokan olion esittely... tMyn11 // Pahvilaatikko.h #ifndef PAHVILAATIKKO_H #define PAHVILAATIKKO_H #include "Laatikko.h" class Pahvilaatikko: public Laatikko { public: Pahvilaatikko(); void AsetaJArvo(); Pahvilaatikko(int); void AsetaJArvo(int); ~Pahvilaatikko(); void HaeNaytolle(); private: int* mp_johdettu; }; #endif

12 Johdetun luokan olion esittely... tMyn12 // Laatikko.cpp #include "stdafx.h" #include #include "Laatikko.h" using namespace System; using namespace std; Laatikko::Laatikko() { cout<<"Kantaluokan oletusmuodostin, olio "<<this<<"."<<endl; mp_kanta=new int; AsetaKArvo(); }

13 Johdetun luokan olion esittely... tMyn13 void Laatikko::AsetaKArvo() { cout<<"Anna arvo (kantaluokka), olio "<<this<<": "; cin>>*mp_kanta; } Laatikko::~Laatikko() { cout<<"Kantaluokan hajotin, olio "<<this<<"."<<endl; delete mp_kanta; mp_kanta=0; } void Laatikko::HaeNaytolle() { cout<<"Tietoj\204sen, olio "<<this<<":"<<endl; cout<<"kanta: "<<*mp_kanta<<"."<<endl; }

14 Johdetun luokan olion esittely... tMyn14 // Pahvilaatikko.cpp #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; Pahvilaatikko::Pahvilaatikko() { cout<<"Johdetun luokan oletusmuodostin, olio "<<this<<"."<<endl; mp_johdettu=new int; AsetaJArvo(); }

15 Johdetun luokan olion esittely... tMyn15 void Pahvilaatikko::AsetaJArvo() { cout<<"Anna arvo (johdettu luokka), olio "<<this<<": "; cin>>*mp_johdettu; } Pahvilaatikko::Pahvilaatikko(int johdettu) { cout<<"Johdetun luokan param. muodostin, olio "<<this<<"."<<endl; mp_johdettu=new int; AsetaJArvo(johdettu); } void Pahvilaatikko::AsetaJArvo(int johdettu) { *mp_johdettu=johdettu; }

16 Johdetun luokan olion esittely... tMyn16 Pahvilaatikko::~Pahvilaatikko() { cout<<"Johdetun luokan hajotin, olio "<<this<<"."<<endl; delete mp_johdettu; mp_johdettu=0; } void Pahvilaatikko::HaeNaytolle() { cout<<"Tietoj\204senet, olio "<<this<<":"<<endl; cout<<"kanta: "<<*mp_kanta<<"."<<endl; cout<<"johdettu: "<<*mp_johdettu<<"."<<endl; }

17 Johdetun luokan olion esittely... tMyn17 // peri2Main.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Pahvilaatikko ekaAutom=Pahvilaatikko(); ekaAutom.HaeNaytolle(); ekaAutom.AsetaKArvo(); ekaAutom.HaeNaytolle(); Pahvilaatikko tokaAutom=Pahvilaatikko(58); tokaAutom.HaeNaytolle(); tokaAutom.AsetaJArvo(); tokaAutom.HaeNaytolle(); return 0; } Aluksi kokeillaan automaattisilla olioilla:

18 Johdetun luokan olion esittely... tMyn18

19 Johdetun luokan olion esittely... tMyn19 // peri2aMain.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Pahvilaatikko* ekaDyn=new Pahvilaatikko(); ekaDyn->HaeNaytolle(); ekaDyn->AsetaKArvo(); ekaDyn->HaeNaytolle(); Seuraavaksi kokeillaan dynaamisilla olioilla:

20 Johdetun luokan olion esittely... tMyn20 Pahvilaatikko* tokaDyn=new Pahvilaatikko(57); tokaDyn->HaeNaytolle(); tokaDyn->AsetaJArvo(); tokaDyn->HaeNaytolle(); delete ekaDyn; delete tokaDyn; return 0; }

21 Johdetun luokan olion esittely... tMyn21

22 Johdetun luokan olion esittely... tMyn22 Luotiinpa automaattisia tai dynaamisia olioita johdettuun luokkaan, niin huomataan, että ensimmäiseksi tulee aina kutsuttua kantaluokan muodostin. Siis perityt tietojäsenet alustetaan ensin, ja vasta sitten kutsutaan ”oman luokan” muodostin. Kantaluokassa oli vain yksi muodostin, oletusmuodostin, ja järjestelmä kutsui sen automaattisesti. Hajotinten kutsujärjestys on aina päinvastainen kuin mitä muodostimien kutsuketju.

23 Johdetun luokan olion esittely... tMyn23 Koska edellisen esimerkin tapauksessa johdetun luokan muodostin kutsui aina kantaluokan muodostinta, niin koodia voitaisiin muuttaa seuraavasti havainnollistamaan asiaa. Täsmälleen aiempaa esimerkkiä voitaisiin käyttää nytkin, mutta monipuolistetaan johdettua luokkaa siten, että siihen on toteutettu myös parametrillinen muodostin. Kummatkin johdetun luokan muodostimet kutsuvat aina kantaluokan oletusmuodostinta – koska kantaluokassa ei muunlaista muodostinta olekaan. Aluksi luodaan automaattisia olioita:

24 Johdetun luokan olion esittely... tMyn24 // Laatikko.h #ifndef LAATIKKO_H #define LAATIKKO_H class Laatikko { public: Laatikko(); void AsetaKArvo(); ~Laatikko(); void HaeNaytolle(); protected: int* mp_kanta; }; #endif

25 Johdetun luokan olion esittely... tMyn25 // Pahvilaatikko.h #ifndef PAHVILAATIKKO_H #define PAHVILAATIKKO_H #include "Laatikko.h" using namespace std; class Pahvilaatikko: public Laatikko { public: Pahvilaatikko(); void AsetaJArvot(); Pahvilaatikko(int, string); void AsetaJArvot(int, string); ~Pahvilaatikko(); void HaeNaytolle(); private: int* mp_johdettu1; string* mp_johdettu2; }; #endif

26 Johdetun luokan olion esittely... tMyn26 // Laatikko.cpp #include "stdafx.h" #include #include "Laatikko.h" using namespace System; using namespace std; Laatikko::Laatikko() { cout<<"Kantaluokan oletusmuodostin, olio "<<this<<"."<<endl; mp_kanta=new int; AsetaKArvo(); }

27 Johdetun luokan olion esittely... tMyn27 void Laatikko::AsetaKArvo() { cout<<"Anna arvo (kantaluokka), olio "<<this<<": "; cin>>*mp_kanta; } Laatikko::~Laatikko() { cout<<"Kantaluokan hajotin, olio "<<this<<"."<<endl; delete mp_kanta; mp_kanta=0; } void Laatikko::HaeNaytolle() { cout<<"Tietoj\204sen, olio "<<this<<":"<<endl; cout<<"kanta: "<<*mp_kanta<<"."<<endl; }

28 Johdetun luokan olion esittely... tMyn28 // 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_johdettu1=new int; mp_johdettu2=new string; AsetaJArvot(); }

29 Johdetun luokan olion esittely... tMyn29 void Pahvilaatikko::AsetaJArvot() { cout<<"Anna arvo1 (johdettu luokka), olio "<<this<<": "; cin>>*mp_johdettu1; cin.get(); cout<<"Anna arvo2 (johdettu luokka), olio "<<this<<": "; getline(cin, *mp_johdettu2); } Pahvilaatikko::Pahvilaatikko(int johdettu1, string johdettu2) :Laatikko() { cout<<"Johdetun luokan param. muodostin, olio "<<this<<"."<<endl; mp_johdettu1=new int; mp_johdettu2=new string; AsetaJArvot(johdettu1, johdettu2); }

30 Johdetun luokan olion esittely... tMyn30 void Pahvilaatikko::AsetaJArvot(int johdettu1, string johdettu2) { *mp_johdettu1=johdettu1; *mp_johdettu2=johdettu2; } Pahvilaatikko::~Pahvilaatikko() { cout<<"Johdetun luokan hajotin, olio "<<this<<"."<<endl; delete mp_johdettu1; delete mp_johdettu2; } void Pahvilaatikko::HaeNaytolle() { cout<<"Tietoj\204senet, olio "<<this<<":"<<endl; cout<<"kanta: "<<*mp_kanta<<"."<<endl; cout<<"johdettu1: "<<*mp_johdettu1<<"."<<endl; cout<<"johdettu2: "<<*mp_johdettu2<<"."<<endl; }

31 Johdetun luokan olion esittely... tMyn31 // peri3Main.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h" using namespace System; using namespace std; int main(array ^args) { Pahvilaatikko ekaAutom=Pahvilaatikko(); ekaAutom.HaeNaytolle(); ekaAutom.AsetaKArvo(); ekaAutom.HaeNaytolle();

32 Johdetun luokan olion esittely... tMyn32 Pahvilaatikko tokaAutom(58, string("ihan kuvitteellinen")); tokaAutom.HaeNaytolle(); tokaAutom.AsetaJArvot(); tokaAutom.HaeNaytolle(); return 0; }

33 Johdetun luokan olion esittely... tMyn33

34 Johdetun luokan olion esittely... tMyn34 Muuten sama kuin edellä, mutta dynaamisia olioita:

35 Johdetun luokan olion esittely... tMyn35 // peri4Main.cpp : main project file. #include "stdafx.h" #include #include "Pahvilaatikko.h” using namespace System; using namespace std; int main(array ^args) { Pahvilaatikko* ekaDyn=new Pahvilaatikko(); ekaDyn->HaeNaytolle(); ekaDyn->AsetaKArvo(); ekaDyn->HaeNaytolle();

36 Johdetun luokan olion esittely... tMyn36 Pahvilaatikko* tokaDyn=new Pahvilaatikko(57, string("ei ongelmia")); tokaDyn->HaeNaytolle(); tokaDyn->AsetaJArvot(); tokaDyn->HaeNaytolle(); delete ekaDyn; delete tokaDyn; return 0; }

37 Johdetun luokan olion esittely... tMyn37


Lataa ppt "Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka."

Samankaltaiset esitykset


Iklan oleh Google