wake-up-neo.com

Sind abstrakte Methoden und reine virtuelle Funktionen dasselbe?

Soweit ich weiß, bieten sowohl abstrakte Methoden als auch reine virtuelle Funktionen KEINE Funktionalität. Können wir also sagen, dass sie beide dasselbe sind?

Angenommen, eine Klasse (die nicht unbedingt als abstrakt deklariert ist) enthält eine Reihe implementierter Methoden (nicht abstrakt oder virtuell), enthält jedoch eine rein virtuelle Funktion. Ist diese Klasse dann abstrakt?

52
Ahmad

Ja, das ist dasselbe. In C++ ist eine abstrakte Methode nur eine andere Möglichkeit, die Eigenschaften einer rein virtuellen Funktion zu beschreiben. Beides bedeutet lediglich eine Methode ohne Implementierung, die in einer Unterklasse implementiert werden muss, bevor die Klasse tatsächlich instanziiert werden kann.

Die Situation mit rein virtuellen Funktionen und abstrakten Klassen in C++ ist ähnlich, da sie im Wesentlichen genau dasselbe bedeuten. Jede abstrakte Klasse muss mindestens eine rein virtuelle Funktion haben, sonst könnte sie instanziiert werden und wäre nicht abstrakt. Ebenso muss jede Klasse mit mindestens 1 rein virtuellen Funktion abstrakt sein, da sie erweitert werden muss, damit die Methode tatsächlich implementiert werden kann.

Daher ist eine Klasse abstrakt genau dann, wenn sie enthält mindestens 1 reine virtuelle Funktion/abstrakte Methode.

Später haben Sprachen wie Java und C # solche Dinge expliziter gemacht, sodass ein spezielles Schlüsselwort eine Klassenzusammenfassung anstelle einer rein virtuellen Funktion definieren konnte. Mit C++ können Sie dasselbe tun Dinge wie diese Sprachen, aber sie sind nur ein wenig expliziter darüber.: D

57

Sie deklarieren Klassen oder Methoden in C++ nicht explizit als abstrakt. Das Vorhandensein von rein virtuellen Methoden macht sie abstrakt.

15
Jordão

Ja, abstrakte Methoden sind genau dasselbe wie reine virtuelle Funktionen. Die Begriffe werden oft synonym verwendet. IMO, "Reine virtuelle Funktion" ist der technisch korrekte Begriff in C++, der speziell darauf hinweist, dass die Funktion auf 0 Gesetzt ist:

class myClass {
public:
  virtual void vfunc() = 0; // pure specifier
};

Eine abstrakte Klasse ist definiert durch :

eine Klasse, die speziell für die Verwendung als Basisklasse entwickelt wurde. Eine abstrakte Klasse enthält mindestens eine rein virtuelle Funktion.

Eine abstrakte Klasse ist also im Grunde genommen eine abstrakte Klasse, weil sie als Basisklasse konzipiert wurde (einige Basisklassen müssen per Definition implementierbare Methoden haben, die rein virtuell sein müssen). Diese Klassen werden zu abstrakten Klassen, indem sie einfach so verwendet und erweitert werden. Im Gegensatz zu Sprachen wie Java gibt es keinen abstract oder interface Schlüsselwortmodifikator. Aus diesem Grund benötigen wir einen "mündlichen Vertrag", um über abstrakte Klassen in C++ zu sprechen.

6
David Titarenco

In C++ führt eine reine virtuelle Elementfunktion dazu, dass der einschließende Typ ein "abstrakter Typ" ist.

Funktionen selbst können nicht abstrakt sein, obwohl der Begriff häufig auf diese Weise missbraucht wird.

Ich würde ja sagen, abstrakte Methoden und rein virtuelle Funktionen sind konzeptionell dasselbe.

Angenommen, eine Klasse (die nicht unbedingt als abstrakt deklariert ist) enthält eine Reihe implementierter Methoden (nicht abstrakt oder virtuell), enthält jedoch eine rein virtuelle Funktion. Ist diese Klasse dann abstrakt?

Eine Klasse mit mindestens 1 rein virtuellen Funktion wird als abstrakte Klasse bezeichnet.

3
Akhil