Virtuelle Methoden in MSVisual 6.0

Hallo zusammen ich übe gerade mit Visual 6.0

Themen sind:

  • Vererbung
  • Polymorphismus

Jetzt wollte ich in einer vererbten Klasse eine bereits in der Basisklasse geschriebene Methode neu schreiben.
Damit dann auch die richtige Methode aufgeufen wird muß ich ja normalerweise in der Basisklasse vor die Methode das Wort virtual schreiben.

Komischerweise funktioniert es auch ohne das Wort?

Weis jemand ob das vieleicht am Programm also MS Visual c++ 6.0 liegt?

Wenn ja kann man das irgendwie umstellen so daß das Wort virtual geschrieben werden muß??

Der Rest der Frage spielt eigentlich in dem Zusammenhang keine große Rolle.

Weis jemand ob das vieleicht am Programm also MS Visual c++
6.0 liegt?

Das ist gut möglich. Der Compiler von MSVC6 ist alles, nur kein C+±Compiler. Wenn du einen nörgelnden Compiler willst, schau’ dir eventuell mal GCC an (wird unter anderem in DevC++ verwendet), wenn man den richtig einstellt ist er sehr restriktiv und kennt wesentlich mehr Bestandteile des Standards.

Hallo zusammen ich übe gerade mit Visual 6.0

Themen sind:

  • Vererbung
  • Polymorphismus

Wenn ja kann man das irgendwie umstellen so daß das Wort
virtual geschrieben werden muß??

Das kann nicht sein: natürlich kann man die Methode mit und ohne virtual definieren und dann überschreiben, allerdings sind damit auch 2 verschiedene Dinge gemeint.

Näheres: http://www.codersource.net/cpp_virtual_functions.html

Reinhard

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]