Hi,
das sind 2 verschiedene Dinge. Grundsätzlich wird eine als virtual deklarierte Methode als Funktionszeiger implementiert (zumindest bei MSVC), damit wird immer zur Laufzeit die korrekte Methodenimplementierung aufgerufen.
Ohne „virtual“ hängt es davon ab, welche Klasse Dein Objekt hat. Ein Beispiel zeigt das vermutlich am Besten:
class Base {
void Method_A(); // non virtual
virtual void Method_B();
}
class Derived : public Base {
void Method_A(); // non-virtual override
void Method_B(); // virtual override
}
Derived* pDerived = new Derived;
pBase = (Base*)pDerived;
pDerived->MethodA(); // Implementierung der Klasse Derived
pDerived->MethodB(); // Implementierung der Klasse Derived
pBase->MethodA(); // Implementierung der Klasse Base (nicht virtual!)
pBase->MethodB(); // Implementierung der Klasse Derived (virtual!)
Dies zeigt also, dass bei nicht-virtual der Compiler aufgrund der Klasse des Objekts die Methode auswählt; bei virtual wird immer die korrekte Methode aufgerufen.
Das kann man als Feature nutzen (gezielte Ausführung einer bestimmten Implementierung mittels Casting), ist mE allerdings eher in den Bereich des unnötigen Hacks einzuordnen.
LG,
Ernest
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]