Laboratorium 10
1. Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z obsługą C++.
2. Przykłady
Zad1
Przykład prezentujący istotę dziedziczenia klas. Dziedziczenie jest to technika pozwalająca na definiowanie nowej klasy przy wykorzystaniu już wcześniej istniejącej. Poniżej została przedstawiona klasa pojazd oraz jej pochodna klasa super_pojazd.
class pojazd // definiujemy klasę pojazd
{
public: // parametry klasy pojazd
int predkosc;
int przyspieszenie;
int marka;
int model;
int kolor;
};
Chcąc utworzyć klasę zbliżoną do klasy pojazd, nie trzeba pisać całej klasy od początku - można skorzystać z dziedziczenia klas (tworząc pochodną klasy pojazd).
class super_pojazd : public pojazd // informacja dla kompilatora, że klasa
// super_pojazd jest pochodną klasy pojazd
{
public:
int turbo; // rozbudowanie klasy pojazd o parametr turbo
};
Zad2
Przykładowy program korzystający z dziedziczenia klas w języku C++. W programie przedstawiono definicję klasy o nazwie osoba i jeden obiekt tej klasy student1. Następnie utworzono klasę nowa_osoba dziedziczącą z klasy osoba oraz obiekt tej klasy student2. W nowej klasie został dodany parametr plec (płeć).
#include <iostream.h>
#include <string.h>
#include <conio.h>
class osoba {
public :
char nazwisko [80] ; //zmienne nazwisko i wiek beda odziedziczone przez klase nowa_osoba
int wiek ;
void zapamietaj (char * napis, int lata) ; // deklaracja pierwotnej funkcji zapamietaj
void wypisz () // definicja pierwotnej funkcji wypisz
{
cout << "\t" << nazwisko << " , lat : "
<< wiek <<endl ;
}
} ;
void osoba :: zapamietaj (char * napis, int lata) // definicja pierwotnej funkcji zapamitej
{
strcpy (nazwisko, napis) ;
wiek = lata ;
}
class nowa_osoba : public osoba
{
public:
char plec [20];
void zapamietaj (char * napis, int lata, char * napis2) ; // deklaracja nowej funkcji zapamietaj
void wypisz () // definiujemy nowa funkcje wypisz
{
cout << "\t" << nazwisko << " , lat : "
<< wiek << " , " << plec <<endl ;
}
};
void nowa_osoba :: zapamietaj (char * napis, int lata, char * napis2) // definicja nowej funkcji zapamietaj
{
strcpy (nazwisko, napis) ;
strcpy (plec, napis2) ;
wiek = lata ;
}
main ()
{
osoba student1 ;
student1.zapamietaj ("Jan Kowalski", 22) ;
cout << "Po wpisaniu informacji do obiektow. "
"Sprawdzamy : \n" ;
cout << "dane z obietku student1\n" ;
student1.wypisz () ;
nowa_osoba student2 ;
student2.zapamietaj ("Ewa Kowalska", 24, "kobieta") ;
cout << "Po wpisaniu informacji do obiektow. "
"Sprawdzamy : \n" ;
cout << "dane z obietku student2\n" ;
student2.wypisz () ;
getch();
}
Zad3
Przykładowy program obrazujący polimorfizm (funkcje wirtualne). Funkcje wirtualne to jakby 'inteligentne' funkcje, które potrafią się dostosować do samego programu. Aby stworzyć taką funkcję, wystarczy poprzedzić deklarację słówkiem virtual i program stanie się 'inteligentny'.
Załóżmy, że mamy dwie klasy: klasę A i dziedziczącą po niej klasę B.
#include <iostream>
class A
{
public:
int Zmienna()
{ cout << "Bazowa"; }
};
class B: public A
{
public:
int Zmienna()
{ cout << "Pochodna"; }
};
Tworzymy obiekt klasy pochodnej trzymany za wskaźnik do klasy bazowej:
int main()
{
B b;
A* p = &b;
int a = p->Zmienna();
return 0;
}
Widzimy, że p wskazuje na obiekt typu B, to jednak zostanie wywołane A::Zmienna. Jednak ta metoda to zwykła funkcja. Skąd kompilator ma wiedzieć, że obiekt, na który wskazuje p jest obiektem typu B? Za chwilę w tym samym kodzie ten sam wskaźnik może wskazać na obiekt innego typu. Jak widzimy w tym miejscu informacja o dodatkach klasy B została utracona. Język C++ w zwykłych klasach nie umieszcza informacji o typie, który pozwalałaby go identyfikować. Nie oznacza to jednak, że w C++ są tylko takie klasy. Po dodaniu w deklaracji klasy A przed nazwą metody słowo kluczowe "virtual":
class A
{
public:
virtual int Zmienna()
{ cout << "Bazowa"; }
};
Jak widzimy, zmiana w klasie B nie jest już konieczna. Każda z klas, w której zadeklarowano choć jedną metodę wirtualną, staje się klasą "Polimorficzną" i zawiera w sobie informacje, pozwalające na identyfikację typu. Każda metoda, która jest zadeklarowana jako wirtualna, podlega "Dynamicznemu wiązaniu".
3. Program ćwiczenia
Zad4
Wzorując się na przykładowym programie z Zad2, należy napisać program zawierający klasę o nazwie osoba oraz jej klasę pochodną nowa_osoba. Zdefiniować po 4 obiekty tych klas (np. student1...student4 i nowy_student1...nowy_student4). Obiektom klasy osoba przypisać wartości nazwisko i wiek, natomiast obiekty klasy pochodnej uzupełnić o zmienną płeć. Następnie należy wyświetlić informacje znajdujące się w poszczególnych obiektach.
Zad5
Należy napisać program wykorzystujący w swoim działaniu polimorfizm (funkcje wirtualne). W programie należy zdefiniować klasę Kontynent i jej pochodną klasę Panstwo. W klasie Kontynent należy umieścić funkcję wyświetlającą na ekran informację, że np.: "Na mapie wskazywana jest cała Europa". Następnie w klasie Panstwo należy umieścic tą samą funkcję wyświetlającą na ekran, której użyto w klasie Kontynent, jednak wypisującą na ekran np: "Teraz na mapie wskazujemy na Polskę". Kolejno przy użyciu wskaźnika odwołującego się do funkcji wyświetlającej, należy wypisać na ekran informację podaną w klasie Panstwo. Dzięki zastosowaniu funkcji wirtualnych będzie to możliwe, gdyż program dostosuje się i wyświetli odpowiedni komunikat.
5
Podstawy Informatyki