Functions and formatted printing of time and date for RTC8563
Dependencies: mbed
Virtuelle Methoden
Wenn ein Zeiger auf ein Objekt der Basisklasse einem Zeiger auf ein Objekt der abgeleiteten Klasse zugewiesen wird, werden immer die Methoden der Basisklasse über den Zeiger aufgerufen, da sie bereits zur Kompilierungszeit feststehen. Soll jedoch die gleichnamigen Methoden der abgeleiteten Klasse aufgerufen werden, ist die Basismethode als sogenannte virtuelle Methode zu deklarieren. Mit dieser Änderung werden die Methoden erst zur Laufzeit des Programms an den Zeiger gebunden. Virtuelle Methoden sind Methoden, die mit dem Schlüsselwort virtual definiert werden.
class Date : public RTC { public: virtual string GetDay(string where); }; class DateString : public Date { virtual string GetDay(string where); };
Methodendefinition:
string DateString::GetDay(string where) // same in Date { string day = where + " In DateString Day: " + toString(GetDay()); // oder Date return day; }
Die Adressen der virtuellen Methoden stehen in der Virtual Method Table.
In dieser werden zur Laufzeit eines Programms die Anfangsadressen der zugehörigen aktuellen Methoden gespeichert. Obwohl alle Methoden (der Basisklasse als auch der abgeleiteten Klassen) bereits im Speicher vorhanden sind, werden sie erst durch den Eintrag der Anfangsadresse in die Virtual Method Table an die Instanz gebunden.
See how it works: Virtuelle Methoden
Objekte können im lokalen Speicher angelegt werden und auf die Objekte über den Adress-Operator (&) referenziert werden:
int main() { Date *pBoth; // Zeiger auf ein Objekt der Klasse Date definieren DateString ds; // Instanz ds der Klasse DateString erzeugen Date d; // Instanz d der Klasse Date erzeugen pBoth = &d; // Dem Zeiger das Objekt d zuweisen while(1) { pBoth = &d; // Dem Zeiger das Objekt d zuweisen pc.printf("%s\n", pBoth->GetDay("Where am I?")); // Virtuelle Methode GetDay über Zeiger aufrufen pBoth = &ds; // Dem Zeiger das Objekt d zuweisen pc.printf("%s\n", pBoth->GetDay("Where am I?")); // Virtuelle Methode GetDay über Zeiger aufrufen wait(1); } }
oder dynamisch am Heap und mit Zeiger (pointer):
int main() { // Objekte dynamisch am Heap mit new erzeugen Date *pDate; // Zeiger auf ein Objekt der Klasse Date definieren Date *pDateString; // Zeiger auf ein Objekt der Klasse DateString definieren Date *pBoth; // noch einen Zeiger auf ein Objekt der Klasse Date definieren pDate = new Date; // Mit new wird Speicher wird auf dem Heap für objekt der Klasse Date reserviert pDateString = new DateString; while(1) { pBoth = pDate; pc.printf("%s\n", pBoth->GetDay("Where am I?")); // Virtuelle Methode GetDay über Zeiger aufrufen pBoth = pDateString; pc.printf("%s\n", pBoth->GetDay("Where am I?")); // Virtuelle Methode GetDay über Zeiger aufrufen wait(1); } delete pDate, pBoth, pDateString; // Speicher auf Heap wieder frei geben }
Anderes Beispiel virtual Tier in IdeOne oder mbed Simulator bzw. Code Virtual Tier.