Functions and formatted printing of time and date for RTC8563

Dependencies:   mbed

Virtuelle Methoden

Inhalt

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.

/media/uploads/bulmecisco/vmt.jpg

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.

Dynamische Bindung


All wikipages