Hallo zusammen,
heute wurde uns bei der MSDN Hotline unter anderem folgende Frage gestellt:
Ich brauche mehr Informationen über virtuelle Funktionen in C++. Was ist der Zusammenhang zwischen virtuellen Funktionen und abstrakten Klassen?
Unsere Antwort bzw. unser Lösungsvorschlag darauf war:
Virtuelle Funktionen sind Member-Funktionen, deren Implementierung in Unterklassen geändert werden kann, d.h. die Funktion kann in, von der Basisklasse, erbenden Klassen überschrieben werden. Für diese Funktionen kann der Compiler zur Übersetzungszeit den Funktionsaufruf nicht auflösen. Das passiert erst während der Ausführung des Codes, wenn der dynamische Typ des Bezugsobjektes (this) bekannt ist (Polymorphie). Dies nennt man dynamische Bindung. Virtuelle Funktionen werden in (Visual) C++ durch das Schlüsselwort virtual deklariert. Die Aufrufauflösung zur Laufzeit kann man sich folgendermaßen vorstellen: wenn für ein Objekt die Funktion in der eigenen Klasse nicht überschrieben ist, dann wird bei der direkten Vaterklasse geschaut. Wenn die Funktion dort überschrieben ist, dann wird diese Variante aufgerufen und ausgeführt, ansonsten wird weiter nach oben in der Klassenhierarchie geschaut. Ohne dass eine Funktion als virtual gekennzeichnet ist, kann diese nicht überschrieben werden.
Hier ist ein Beispiel, wie man eine Funktion als virtuell deklariert:
public:
virtual long GetBalance() {
return _balance;
}
Eine spezielle Art der virtuellen Funktionen sind die rein-virtuellen Funktionen (pure virtual functions). Bei diesen Funktionen lässt man den Implementierungsblock leer. Es besteht folgender Zusammenhang zwischen virtuellen Funktionen und abstrakten Klassen: Eine Klasse mit mindestens einer rein-virtuellen Funktion ist abstrakt. Jede Klasse, die von dieser abstrakten Klasse erbt, aber die rein-virtuelle Funktion nicht überschreibt, ist auch abstrakt.
So definiert man eine rein-virtuelle Funktion:
class Account {
public:
Account( long d ); // Constructor.
virtual long GetBalance(); // Obtain balance.
virtual void PrintBalance() = 0; // Pure virtual function.
private:
long _balance;
};
Die Klasse Account ist nach dieser Definition automatisch abstrakt.
Mehr Informationen über virtuelle Funktionen und abstrakte Klassen in (Visual) C++ findet man auf den folgenden Adressen in MSDN Online:
1. MSDN: Virtual Functions
2. MSDN: Abstract Classes (C++)
Falls Sie das Thema Visual C++ interessiert, dann empfehlen wir die folgenden Online-Ressourcen:
3. MSDN: Visual C++ Developer Center
4. MSDN Hotline FAQ (1) - Die C++ Standard Template Library - WebCast
Viele Grüße,
Atanas Dimitrov
MSDN Hotline für MSDN Online Deutschland
Disclaimer:
Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline

Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu Markenzeichen sowie die allgemein gültigen Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.