Virtuelle Funktionen

WorldRacer

Erfahrenes Mitglied
Öhm, joa Um das Thema da oben gehts...Ich hab das Kapitel mit den Virtuellen Funktionen nun in meinem Buch gelesen. Aber ich kapiers nich:confused::confused::confused:....

Kann mir das mal einer auf Deutsch erklären?

Wäre sehr sehr dankbar...
 
Hallo,

das Schlüsselwort virtual vor einer Methode einer Klasse gibt an, das abgeleitete Klassen diese Methode überschreiben können. Das ist besonders bei Polymorphie interessant. Polymorphie bedeutet das Objekte mehrere Typen zur Laufzeit annehmen können. Konkret bedeutet das, das eine Zeigervariable welche später mal auf dein Objekt zeigen soll einen statischen Typ (d.h. der Typ den man bei der Deklaration der Variable angibt) besitzt. Jetzt kannst du diesen Zeiger zur Laufzeit dynamisch auf Objekte von verschiedenen Typen (dynamische Instanziierung) zeigen lassen. Diese Typen wären:
1.) Der statische Typ selber
2.) Ein Subtyp (also eine Spezialisierung) des statischen Typs

Wenn du eine Methode in der Klasse des statischen Types nun als virtuell definierst bedeutet das wenn das Objekt diese Methode ausführt immer die jeweils überschriebene Methode des Subtyps aufgerufen wird. Dies ist nat. abhängig vom dynamischen Typ des Objektes.
Ein Beispiel:
C++:
#include <iostream>

using namespace std;
class VirtualFoo {
    public:
    virtual void bar() {
        cout << "VirtualFoo::bar()" << endl;
    }
};

class Foo1 : public VirtualFoo {
    public:
    void bar() {
        cout << "Foo1::bar()" << endl;
    }
};

class Foo2 : public VirtualFoo {
    public:
    void bar() {
        cout << "Foo2::bar()" << endl;
    }
};

int main()
{
    char input;
    VirtualFoo *f;

    cout << "Which type of object do you want?:";
    cin >> input;

    if (input == '1')
        f = new Foo1();
    else
        f = new Foo2();

    f->bar();
}

Wenn man hingegen das virtual im Supertyp weglässt wird jedesmal die Methode des statischen Types aufgerufen.

HTH,
RedWing
 
ach so, also in deinem beispiel sind jetzt Foo1 und Foo2 Sub-Klassen von VirtualFoo, die alle 3 unterschiedliche bar();->werte liefern...
 
Zurück