00001 /* 00002 Name: DL programowanie zadanie 15 z rozdziału 16 książki Thinking in C++ 00003 Author: Piotr Leżoń 00004 Date: 27-06-06 19:28 00005 Description: 00006 Z. 6 rozdzial 15 TICPP 00007 Utwórz hierarchię dziedziczenia klasy Rodent (gryzoń): Mouse (mysz), 00008 Gerbil (myszoskoczek), Hamster (chomik) itd. W klasie podstawowej 00009 utwórz funkcje, które są wspólne dla wszystkich gryzoni i przedefiniuj je 00010 w klasach pochodnych, umożliwiając różne zachowania, w zależności 00011 od konkretnego typu pochodnego klasy Rodent. Utwórz tablicę wskaźników 00012 do obiektów klasy Rodent, wypełnij ją wskaźnikami do obiektów 00013 poszczególnych klas pochodnych, a następnie wywołaj funkcje, zawarte 00014 w klasie podstawowej, obserwując, co się stanie. 00015 Z. 9 rozdzial 15 TICPP 00016 Rozpoczynając od utworzonej poprzednio hierarchii Rodent, dodaj niewirtualny 00017 destruktor, utwórz obiekt klasy Hamster, używając do tego operatora new. 00018 Następnie dokonaj rzutowania uzyskanego wskaźnika na typ Rodent*, a potem 00019 usuń wskazywany obiekt za pomocą delete, by pokazać, że nie spowoduje to 00020 wywołania wszystkich destruktorów znajdujących się w hierarchii. Zamień 00021 destruktor na wirtualny i pokaż, że wszystko działa teraz prawidłowo. 00022 Z. 10 rozdzial 15 TICPP 00023 Rozpoczynając od utworzonej poprzednio hierarchii Rodent, zmodyfikuj 00024 klasę Rodent, by była czysto abstrakcyjną klasą podstawową. 00025 */ 00026 00027 #include <iostream> 00028 00029 using namespace std; 00030 00031 class Rodent 00032 { 00033 public: 00034 virtual void ile_lap() {cout<<"\tMam 4 lapy"<<endl;} 00035 virtual void zyje()=0; //metoda czysto wirtualna!, wiec klasa jest czysto abstakcyjna klasa podstawowa! 00036 virtual void ludzie() {cout<<"\tLudzie nie lubia gryzoni!"<<endl;} //funkcja wirtualna 00037 virtual ~Rodent() {cout<<"Uruchomiony destruktor klasy Rodent!"<<endl;} //niewirtualny destruktor 00038 //~Rodent() {cout<<"Uruchomiony destruktor klasy Rodent!"<<endl;} 00039 }; 00040 00041 class Mouse : public Rodent 00042 { 00043 public: 00044 void zyje() {cout<<"\tJestem prawie udomowiona ;)"<<endl;} 00045 void ludzie() {cout<<"\tLudzie mnie nie lubia! :("<<endl;} 00046 ~Mouse() {cout<<"\tUruchomiony destruktor klasy Mouse!"<<endl;} 00047 00048 }; 00049 00050 class Gerbil : public Rodent 00051 { 00052 public: 00053 void zyje() {cout<<"\tLudzie nie wiedza jak wygladam"<<endl;} 00054 void ludzie() {cout<<"\tAle i tak mnie tepia"<<endl;} 00055 ~Gerbil() {cout<<"\tUrochomiony destruktor klasy Gerbil!"<<endl;} 00056 }; 00057 00058 class Hamster : public Rodent 00059 { 00060 public: 00061 void zyje() {cout<<"\tCzesto robie za zwierzatko domowe"<<endl;} 00062 void ludzie() {cout<<"\tWiekszosc ludzi mnie lubi"<<endl;} 00063 ~Hamster() {cout<<"\tUruchomiony destruktor klasy Hamster!"<<endl;} 00064 }; 00065 00066 int main() 00067 { 00068 Rodent (* tab_wsk_o_R[4]); //tworzymy tablice wskaznikow na obiekty klasy Rodent 00069 tab_wsk_o_R[0]=new Mouse; //tworzymy nowy obiekt i wstawiamy wskaznik na niego do wczesniej utworzonej tablicy 00070 tab_wsk_o_R[1]=new Gerbil; //j.w 00071 tab_wsk_o_R[2]=new Hamster; //jw. 00072 //tab_wsk_o_R[3]=new Rodent; //nie mozemy utworzyc obiektu klasy Rodent, poniewaz jest to klasa abstrakcyjna - metoda zyje() jest czysto wirtualna! 00073 cout<<"Mysz:"<<endl; 00074 tab_wsk_o_R[0]->zyje(); //wywolujemy funkcje z pierwszego 00075 tab_wsk_o_R[0]->ludzie(); 00076 tab_wsk_o_R[0]->ile_lap(); 00077 cout<<"Myszoskoczek:"<<endl; 00078 tab_wsk_o_R[1]->zyje(); 00079 tab_wsk_o_R[1]->ludzie(); 00080 tab_wsk_o_R[1]->ile_lap(); 00081 cout<<"Chomik:"<<endl; 00082 tab_wsk_o_R[2]->zyje(); 00083 tab_wsk_o_R[2]->ludzie(); 00084 tab_wsk_o_R[2]->ile_lap(); 00085 cout<<endl<<endl; 00086 00087 Rodent* a=new Hamster; //wywoluje tylko destruktor z klasy glownej (tj. Rodent) jesli destruktor jest niewirtualny 00088 delete a; //jesli destruktor jest wirtualny, wysolane zostana destruktory z klasy Hamster oraz Rodent 00089 00090 //for(int i=0;i<3;i++) //usuwamy wszyskie utworzone obiekty z tablicy tab_wsk_o_R 00091 //{ 00092 //delete tab_wsk_o_R[i]; 00093 //} 00094 system("pause"); 00095 return 0; 00096 }