#include <iostream>
#include <string>
using namespace std;

const int DAYS = 0x08;

class Date
{
private:
	uint8_t day, month, year;

public:
	Date():day(1), month(1), year(00)  {} // Initialisierungsliste mit konstante Parameterwerten
	// Initialisierungsliste ueber parametrisierten Konstruktor
	Date(uint8_t _day, uint8_t _month, uint8_t _year):day(_day), month(_month), year(_year) {}

    uint8_t GetDay();		// Methode
    virtual string GetDay(string where); 
};

string Date::GetDay(string where)
{
    //day = "Datestr " + toString(value);
    string day = where + " In Date Day: " + to_string(GetDay());
    return day;
}

uint8_t Date::GetDay()
{
    return day;
}

class DateString : public Date
{
public:
    DateString():Date() {}
    DateString(uint8_t _day, uint8_t _month, uint8_t _year): Date(_day, _month, _year) {}

	int GetDay() { return 10; }
	int GetDay(int xy) { return 99; }  
	virtual string GetDay(string where);
};

string DateString::GetDay(string where)
{
    //day = "Datestr " + toString(value);
    string day = where + " In DateString Day: " + to_string(GetDay());
    return day;
}

int main()
{
    Date *pBoth;
    DateString ds;
    Date d;
    pBoth = &d;     // Mit new wird Speicher wird auf dem Heap reserviert

// löschen Sie virtual vor der Deklaration. Wann und was ändert sich am Ergebnis?

    pBoth = &d;
    cout << pBoth->GetDay("Where am I?") << endl;  // Virtuelle Methode GetDay return 1
    pBoth = &ds;
    cout << pBoth->GetDay("Where am I?") << endl;  // Virtuelle Methode GetDay  return 10;
}
