/* Beispiel: Klassen (Vererbung, Attribute, Methoden, Konstruktor, Destruktor)
   Filename: main.cpp
   Author: Lahmer
   Title: Vererbung von Klassen
   Description: In diesem Beispiel lernen Sie das Konzept von Vererbungen in Klassen kennen. 
   Change: 15.02.2018
*/
 
 
#include <iostream>
 
using namespace std;
 
 
bool ungleichNULL(int i)		//FUNKTION ungleichNULL prüft Variable ob > 0
{
	if(i>0)
	{
		return true;
	}
	else 
	{
		return false;
	}
}
 
 
struct PersonStrukt{		//Struktur PersonStrukt
	//Standardzugriffsrecht public
	string name;			//Attribut name
	string adresse;			//Attribut adresse
};
 
class Person  	//(BASIS-)Klasse Person 
{
	//Standardzugriffsrecht = private
    private:				//Zugriffsrecht private -> nur in der Klasse selbst verwendbar; nicht im Hauptprogramm und in den vererbten Klassen
		string adresse;		//Attribute
 
	protected:				//Zugriffsrecht protected -> in der Klasse selbst + in allen abgeleiteten Klassen verwendbar; nicht im Hauptprogramm
		int svnr;			
 
	public:					//Zugriffsrecht public -> überall verwendbar (Klasse selbst, vererbten Klassen, Hauptprogramm)
		string telefonnr;
		string name;
 
 
		//Methode setAdresse
		void setAdresse(string s)
		{
			adresse=s;
		}
		string getAdresse()
		{
			return adresse;	
		}
		//Konstruktor = spezielle Methode ohne Rückgabewert zur Initialisierung von Variablen
		Person()
		{
			adresse="Amstetten";
			name="Max Mustermann";
		}
		Person(string adr, string n)
		{
			adresse=adr;
			name=n;
		}
		//Destruktor = spezielle Methode ohne Rückgabewert zum Freigeben/Löschen von Variablen
		~Person()
		{
			cout << endl << "Objekt wird geloescht!" << endl;
		}
};
 
class Partner : public Person 		//Klasse Partner ist vererbt (=abgeleitet) von der Klasse Person
{
    public:
       	string Kto, BLZ;
 
    /* 	nicht möglich, da id private ist
 
		void setID(int idnr)
       	{
       		id=idnr;
		}
	*/
 
		//Möglich, da svnummer protected ist
    	void setSVNR(int svnummer)		//METHODE
    	{
    		svnr=svnummer;
		}
		bool groesserNULL()			//Methode groesserNULL, die eine Funktion ungleichNULL von außerhalb aufruft
		{
			return ungleichNULL(svnr);
		}
};
 
class Mitarbeiter : public Partner 	//Klasse Mitarbeiter ist abgeleitet von der Klasse Partner
{
    public:			
       string Krankenkasse;
};
 
class Kunde : public Partner 		//Klasse Kunde ist vererbt von der Klasse Partner
{
    public:
       string Lieferadresse;
};
 
class Lieferant : public Partner 	//Klasse Lieferant ist abgeleitet von der Klasse Partner
{
    public:
       int anzRechnungen;
};
 
class Aussendienst : public Mitarbeiter 	//Klasse Aussendienst ist abgeleite von der Klasse Mitarbeiter
{
    public:
       string Bezirk;
};
 
int main (void) {
 
 	PersonStrukt p1;			//Objekt p1 von der Klasse PersonStrukt 	
	p1.name="Mario";
	p1.adresse="Amstetten";
 
 
	cout << endl << "PERSONEN: ";
	Person person1;			//Objekt person1 von der Klasse Person
	person1.name="Moritz";
	person1.setAdresse("Ulmerfeld");
	cout << person1.getAdresse();
 
	Person person2;
	cout << endl << person2.name;
	cout << endl << person2.getAdresse();
 
	Person person3("Waldhausen","Lisa");
	cout << endl << person3.name;
	cout << endl << person3.getAdresse();
 
	Partner partner1;
	partner1.Kto="12341235";
	partner1.setSVNR(2790);
	partner1.setSVNR(0);
	cout << endl << endl << "PARTNER: ";
	cout << endl << partner1.name << endl;
	cout << partner1.groesserNULL();
 
	Mitarbeiter m1;
	m1.Kto="12341235";
	m1.setSVNR(2790);
	m1.setSVNR(0);
	m1.name="Mitarbeiter Sven";
	cout << endl << endl << "MITARBEITER: ";
	cout << endl << m1.name << endl;
	cout << m1.groesserNULL();
 
	Kunde k1;
	k1.Lieferadresse="St. Pölten";
	k1.name="Kunde MediaMarkt";
	cout << endl << endl << "KUNDE: ";
	cout << endl << k1.name << endl;
	cout << k1.groesserNULL();
 
	Lieferant l1;
	l1.anzRechnungen=3;
	l1.name="Lieferant Hollywood";
	cout << endl << endl << "LIEFERANT: ";
	cout << endl << l1.name << endl;
	cout << l1.groesserNULL();
 
 
	Aussendienst a1;
	a1.Bezirk="Meidling";
	a1.name="Aussendienstfuzi";
	cout << endl << endl << "AUSSENDIENST: ";
	cout << endl << a1.name << endl;
	cout << a1.groesserNULL();
 
   	return 0;
}