wo ist der unterschied zwischen override und virtual?
was ist virtual? :) kann das jemand vllt in seinen worten erklären
3 Antworten
Eine Methode muss virtual sein, um in einer Subklasse override zu erlauben.
Das eine ist also die Voraussetzung für das Andere.
Es geht um C#. Ersichtlich an der Syntax, der Konvention und den Tags an der Fragestellung.
Nur virtuelle Methoden können überschrieben werden. Das override-Schlüsselwort wird auch verwendet, um abstrakte Methoden zu definieren.
Die Tags fehlten zuvor.
Syntax hätte auch zu Java gepasst.
Aber die übrigen Fragen des Fragenstellers liesen auf C# tippen, ja.
Nur virtuelle Methoden können überschrieben werden. Das override-Schlüsselwort wird auch verwendet, um abstrakte Methoden zu definieren.
Hm, okay. Also ich kann mich nicht entsinnen je Probleme gehabt zu haben, wenn ich nicht-virtuelle Klassen versuchte mittels override zu überschreiben. Eigentlich verwende ich das Keyword in C++ genauso wie in Java. (Aber womöglich sind mir auch nur aufgetretene Probleme entfallen, da diese leicht zu beheben waren.)
In Java gibt es kein Schlüsselwort virtual. 😋
(...) Also ich kann mich nicht entsinnen je Probleme gehabt zu haben (...)
Ich beziehe mich in meinem Kommentar gänzlich auf C#.
In Java hast du keine explizit sprachliche Kennzeichnung für virtual/override, aber kannst optional die Annotation @Override anheften, um den Compiler prüfen zu lassen, ob du tatsächlich gerade eine Methode überschreibst.
In C++ wiederum kannst du das Schlüsselwort override nutzen (wie in Java optional, da hier erst mit Version 11 eingeführt). Wenn du versuchst, eine Methode zu überschreiben, die nicht als virtual gekennzeichnet wurde, überdeckst du sie nur. Das heißt, der Polymorphie-Mechanismus greift nicht wie gewohnt.
Beispiel:
#include <iostream>
class Base {
public:
void doSomething() {
std::cout << "doSomething (base)" << std::endl;
}
virtual void doSomethingVirtual() {
std::cout << "doSomethingVirtual (base)" << std::endl;
}
};
class Sub : public Base {
public:
void doSomething() {
std::cout << "doSomething (sub)" << std::endl;
}
void doSomethingVirtual() {
std::cout << "doSomethingVirtual (sub)" << std::endl;
}
};
int main() {
Base* sub = new Sub;
sub->doSomething(); // doSomething (base)
sub->doSomethingVirtual(); // doSomethingVirtual (sub)
return 0;
};
Wenn du nun noch das override-Schlüsselwort einsetzt:
class Sub : public Base {
public:
void doSomething() override {
std::cout << "doSomething (sub)" << std::endl;
}
/* ... */
};
erhältst du aus diesem Grund einen Compilerfehler.
error: ‘void Sub::doSomething()’ marked ‘override’, but does not override
Eine virtuelle Methode kann quasi nicht direkt aufgerufen werden (sie kann aber womöglich als Fallback dienen, wenn eine erbende Klasse die Methode nicht implementiert).
Mit "override" kennzeichnest du Methoden, die andere Methoden überschreiben sollen.
Die Schlüsselwörter "override" und "virtual" werden verwendet, um eine Methode in einer abgeleiteten Klasse zu überschreiben. Der Unterschied zwischen den beiden liegt darin, wie sich die Methode in der Vererbungshierarchie verhält.
Eine "virtual"-Methode in der Basisklasse (Die Klasse, von der geerbt wird) kann von einer abgeleiteten Klasse (Die Klasse, die erbt) überschrieben werden, indem das Schlüsselwort "override" verwendet wird. Eine virtuelle Methode wird in der Basisklasse definiert und in der abgeleiteten Klasse überschrieben, um eine spezifischere, also eine an die Klasse angepasste Implementierung der Methode bereitzustellen.
Hier ist ein Beispiel, das verdeutlicht, wie "virtual" und "override" verwendet werden:
class Tier
{
//Methode wird definiert
public virtual void MacheGeraeusch()
{
Console.WriteLine("Das Tier macht ein Geräusch");
}
}
class Hund : Tier //Erbt von der Basisklasse "Tier"
{
//Methode wird überschrieben
public override void MacheGeraeusch()
{
Console.WriteLine("Der Hund bellt");
}
}
class Katze: Tier //Erbt von der Basisklasse "Tier"
{
//Die MacheGeraeusch-Methode wird nicht überschrieben
}
Hier die Outputs, bei Methodenaufruf:
-> Hund.MacheGeraeusch(); = "Der Hund bellt"
-> Katze.MacheGeraeusch(); = "Das Tier macht ein Geräusch"
-> Tier.MacheGeraeusch(); = "Das Tier macht ein Geräusch"
Ich denke, das ist einigermaßen verständlich.
Weiter Infos findest du in den Microsoft Docs
Nein, das stimmt nicht. Du kannst auch nicht-virtuelle Methoden überschreiben.
Sowohl in Java (darum geht es hier vermutlich), als auch in C++.
EDIT: (Wobei ich bei letzterem gerade nicht sicher bin, ob das schlicht vom Compiler abhängt, ob das durchgeht, oder ob das generell erlaubt ist. Sehe aber keine n Grudn wieso nicht.)