zad_6_r15.cpp

IdĽ do dokumentacji tego pliku.
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 }

Wygenerowano Tue Jun 27 19:36:04 2006 dla DL programowanie, zadania 6, 9, 10 z rozdzialu 15 ksiazki Thinking in C++ programem  doxygen 1.4.6-NO