wo ist der unterschied zwischen override und virtual?

3 Antworten

Eine Methode muss virtual sein, um in einer Subklasse override zu erlauben.

Das eine ist also die Voraussetzung für das Andere.

Woher ich das weiß:Berufserfahrung – Berufserfahrung
Destranix  19.04.2023, 19:21
Eine Methode muss virtual sein, um in einer Subklasse override zu erlauben.

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.)

0
regex9  19.04.2023, 22:27
@Destranix

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.

1
Destranix  20.04.2023, 07:08
@regex9

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.)

0
regex9  20.04.2023, 13:10
@Destranix

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
1
Destranix  20.04.2023, 14:03
@regex9

Ich habe schon echt lange kein Java mehr programmiert.

0

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

Override

Virtual

Woher ich das weiß:eigene Erfahrung – Leidenschaftlicher C# Entwickler und Foren Admin