Program w C++ obrazujący dziedziczenie klas

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;
}
  • Kaśka

    Wszystko ok, ale dlaczego mieszasz polskie i niepolskie nazwy w kodzie? ‘getWlasciciel’ Seriously?

  • Ja bym się spytać w jakim fragmencie można zauważyć dziedziczeni klas?