Poniższy program został napisany na labolatoria z C++ i ma pokazać w jaki sposób klasy po sobie dziedziczą
Co to jest dziedziczenie?
Często podczas tworzenia klasy napotykamy na sytuację, w której klasa ta powiększa możliwości innej klasy, nierzadko precyzując jednocześnie jej funkcjonalność. Dziedziczenie daje nam możliwość wykorzystania nowych klas w oparciu o stare klasy. Nie należy jednak traktować dziedziczenia jedynie jako sposobu na współdzielenie kodu między klasami. Dzięki mechanizmowi rzutowania możliwe jest interpretowanie obiektu klasy tak, jakby był obiektem klasy z której się wywodzi. Umożliwia to skonstruowanie szeregu klas wywodzących się z tej samej klasy i korzystanie w przejrzysty i spójny sposób z ich wspólnych możliwości. Należy dodać, że dziedziczenie jest jednym z czterech elementów programowania obiektowego (obok abstrakcji, enkapsulacji i polimorfizmu).
Klasę z której dziedziczymy nazywamy klasą bazową, zaś klasę, która po niej dziedziczy nazywamy klasą pochodną. Klasa pochodna może korzystać z funkcjonalności klasy bazowej i z założenia powinna rozszerzać jej możliwości (poprzez dodanie nowych metod, lub modyfikację metod klasy bazowej).
Więcej na: http://pl.wikibooks.org/wiki/C++/Dziedziczenie
A poniżej przykład jak to działa w praktyce. Niestety zdaję sobie sprawy z pewnych ułomności napisanego programu. W następnych programach będzie już lepiej…
osoba.h
/* * Grzegorz Bernaś, * https://www.bernas.com.pl * * OS: Ubuntu (6.10) Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2007 Grzegorz Bernaś * Version 0.9 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ #include <iostream> #include <string> using namespace std; class Osoba { private: string nazwisko; public: Osoba(); Osoba(string n); Osoba(const Osoba& os); string getNazwisko() const; void setNazwisko(string n); Osoba& operator=(const Osoba &os); friend istream& operator>> (istream &we, Osoba &os); friend ostream& operator<< (ostream &wy, const Osoba &os); }; Osoba::Osoba() { setNazwisko(""); } Osoba::Osoba(const Osoba& os) { nazwisko = os.getNazwisko(); } Osoba::Osoba(string n) { nazwisko = n; } string Osoba::getNazwisko() const { if(nazwisko.size() == 0) return "-- brak --"; else return nazwisko; } void Osoba::setNazwisko(string n) { nazwisko = n; } Osoba & Osoba::operator=(const Osoba& os) { if (this != &os) { setNazwisko(""); setNazwisko(os.getNazwisko()); } return * this; } istream& operator>> (istream& we, Osoba& os) { cout << "Podaj nazwisko: "; string n; we >> n; os.setNazwisko(n); return we; } ostream& operator<< (ostream &wy, const Osoba &os) { wy << "Nazwisko: " << os.getNazwisko() << endl; return wy; }
samochod.h
/* * Grzegorz Bernaś, * https://www.bernas.com.pl * * OS: Ubuntu (6.10) Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2007 Grzegorz Bernaś * Version 0.9 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ #include <iostream> #include <string> class Samochod { private: string Marka; int Pojemnosc; Osoba Wlasciciel; public: Samochod(); Samochod(string marka, int pojemnosc, Osoba wlasciciel); Samochod(string marka, int pojemnosc); string getMarka(); int getPojemnosc(); Osoba getWlasciciel(); void setMarka(string marka); void setPojemnosc(int pojemnosc); void assignWlasciciel(Osoba Wlasciciel); friend istream& operator>> (istream &we, Samochod &sm); friend ostream& operator<< (ostream &wy, Samochod &sm); }; Samochod::Samochod() { setMarka(""); setPojemnosc(0); Osoba _new; assignWlasciciel(_new); } Samochod::Samochod(string marka, int pojemnosc, Osoba wlasciciel) { setMarka(marka); setPojemnosc(pojemnosc); assignWlasciciel(wlasciciel); } Samochod::Samochod(string marka, int pojemnosc) { setMarka(marka); setPojemnosc(pojemnosc); } string Samochod::getMarka() { if(Marka.size() == 0) return "-- brak --"; else return Marka; } int Samochod::getPojemnosc() { return Pojemnosc; } Osoba Samochod::getWlasciciel() { return Wlasciciel; } void Samochod::setMarka(string marka) { Marka = marka; } void Samochod::setPojemnosc(int pojemnosc) { Pojemnosc = pojemnosc; } void Samochod::assignWlasciciel(Osoba wlasciciel) { Wlasciciel = wlasciciel; } istream& operator>> (istream &we, Samochod &sm) { cout << "Podaj marke: "; string marka; we >> marka; sm.setMarka(marka); cout << "Podaj pojemnosc silnika: "; int poj; we >> poj; sm.setPojemnosc(poj); we >> sm.Wlasciciel; return we; } ostream& operator<< (ostream &wy, Samochod &sm) { wy << "Marka: " << sm.getMarka() << endl; wy << "Pojemnosc: " << sm.getPojemnosc() << endl; wy << sm.getWlasciciel(); return wy; }
osobowy.h
/* * Grzegorz Bernaś, * https://www.bernas.com.pl * * OS: Ubuntu (6.10) Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2007 Grzegorz Bernaś * Version 0.9 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ class Osobowy : public Samochod { private: int LiczPas; double PojBag; int LiczDrzwi; public: Osobowy(); Osobowy(string marka, int pojemnosc, int liczPas, double pojBag, int liczDrzwi); int getLiczPas(); double getPojBag(); int getLiczDrzwi(); void setLiczPas(int liczPas); void setPojBag(double pojBag); void setLiczDrzwi(int liczDrzwi); friend ostream& operator<< (ostream &wy, Osobowy &os); }; Osobowy::Osobowy():Samochod() { setLiczPas(0); setPojBag(0.0); setLiczDrzwi(0); } Osobowy::Osobowy(string marka, int pojemnosc, int liczPas, double pojBag, int liczDrzwi):Samochod(marka,pojemnosc) { LiczPas = liczPas; PojBag = pojBag; LiczDrzwi = liczDrzwi; } int Osobowy::getLiczPas() { return LiczPas; } double Osobowy::getPojBag() { return PojBag; } int Osobowy::getLiczDrzwi() { return LiczDrzwi; } void Osobowy::setLiczPas(int liczPas) { LiczPas = liczPas; } void Osobowy::setPojBag(double pojBag) { PojBag = pojBag; } void Osobowy::setLiczDrzwi(int liczDrzwi) { LiczDrzwi = liczDrzwi; } ostream& operator<< (ostream &wy, Osobowy &os) { wy << "Marka: " << os.getMarka() << endl; wy << "Pojemnosc: " << os.getPojemnosc() << endl; wy << "Liczba Pasażerów: " << os.getLiczPas() << endl; wy << "Pojemnośc bagażnika: " << os.getPojBag() << endl; wy << "Liczba drzwi: " << os.getLiczDrzwi() << endl; wy << os.getWlasciciel(); return wy; }
ciezarowy.h
/* * Grzegorz Bernaś * https://www.bernas.com.pl * * OS: Ubuntu (6.10) Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2007 Grzegorz Bernaś * Version 0.9 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ class Ciezarowy : public Samochod { private: double Ladownosc; int LiczOsi; bool UrzSamWyl; public: Ciezarowy(); Ciezarowy(string marka, int pojemnosc, double ladownosc, int liczOsi, bool urzSamWyl); double getLadownosc(); int getLiczOsi(); string getUrzSamWyl(); void setLadownosc(double ladownosc); void setLiczOsi(int liczOsi); void setUrzSamWyl(bool uszSamWyl); friend ostream& operator<< (ostream &wy, Ciezarowy &cz); }; Ciezarowy::Ciezarowy():Samochod() { setLadownosc(0); setLiczOsi(0); setUrzSamWyl(0); } Ciezarowy::Ciezarowy(string marka, int pojemnosc, double ladownosc, int liczOsi, bool urzSamWyl):Samochod(marka, pojemnosc) { setLadownosc(ladownosc); setLiczOsi(liczOsi); setUrzSamWyl(urzSamWyl); } double Ciezarowy::getLadownosc() { return Ladownosc; } int Ciezarowy::getLiczOsi() { return LiczOsi; } string Ciezarowy::getUrzSamWyl() { if(UrzSamWyl == true) return "Tak"; else return "Nie"; } void Ciezarowy::setLadownosc(double ladownosc) { Ladownosc = ladownosc; } void Ciezarowy::setLiczOsi(int liczOsi) { LiczOsi = liczOsi; } void Ciezarowy::setUrzSamWyl(bool uszSamWyl) { UrzSamWyl = uszSamWyl; } ostream& operator<< (ostream &wy, Ciezarowy &cz) { wy << "Marka: " << cz.getMarka() << endl; wy << "Pojemnosc: " << cz.getPojemnosc() << endl; wy << "Ładowność: " << cz.getLadownosc()<< endl; wy << "Liczba osi: " << cz.getLiczOsi() << endl; wy << "Urządzanie samo wyładowujące: " << cz.getUrzSamWyl() << endl; wy << cz.getWlasciciel(); return wy; }
UnitTest.cpp
/* * Grzegorz Bernaś, * https://www.bernas.com.pl * * OS: Ubuntu (6.10) Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2007 Grzegorz Bernaś * Version 0.9 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ #include "osoba.h" #include "samochod.h" #include "ciezarowy.h" #include "osobowy.h" int main() { Osoba kowalski("Kowalski"), nowak, gruszka("Gruszka"); /*cout << kowalski; cout << nowak; nowak = kowalski; cout << nowak; Osoba sobowtor(gruszka); cout << sobowtor; cin >> nowak; cout << nowak; cin >> sobowtor; cout << sobowtor;*/ Samochod maluch, fiat("Fiat", 3, gruszka), opel("Opel", 4); opel.assignWlasciciel(kowalski); cout << " --- Podaj dane --- " << endl; cin >> maluch; cout << " --- Wyświetl dane --- " << endl; cout << maluch; cout << endl; cout << fiat; Osobowy tigra; cout << endl; cout << tigra; Ciezarowy tir; cout << endl; cout << tir; }