it-swarm.com.de

Unterschied zwischen einer virtuellen Funktion und einer reinen virtuellen Funktion

Mögliches Duplikat:
C++ Virtual/Pure Virtual Explained

Was ist der Unterschied zwischen einer reinen virtuellen Funktion und einer virtuellen Funktion?

Ich weiß, "Pure Virtual Function ist eine virtuelle Funktion ohne Körper", aber was bedeutet das und was wird durch die folgende Zeile tatsächlich getan:

virtual void virtualfunctioname() = 0
196

Eine virtuelle Funktion macht ihre Klasse zu einer polymorphen Basisklasse. Abgeleitete Klassen können virtuelle Funktionen überschreiben. Virtuelle Funktionen, die über Basisklassenzeiger/-referenzen aufgerufen werden, werden zur Laufzeit aufgelöst. Das heißt, der dynamische Typ des Objekts wird anstelle seines statischen Typs verwendet:

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

Eine rein virtuelle Funktion ist eine virtuelle Funktion, deren Deklaration mit =0 Endet:

class Base {
  // ...
  virtual void f() = 0;
  // ...

Eine rein virtuelle Funktion macht implizit die Klasse, für die sie definiert ist abstract (anders als in Java, wo Sie ein Schlüsselwort haben, um die Klasse abstract explizit zu deklarieren) Kann nicht instanziiert werden. Abgeleitete Klassen müssen alle vererbten rein virtuellen Funktionen überschreiben/implementieren. Andernfalls werden auch sie abstrakt.

Ein interessantes Merkmal von C++ ist, dass eine Klasse eine rein virtuelle Funktion definieren kann, die eine Implementierung hat. ( Wofür das gut ist, ist umstritten .)


Beachten Sie, dass C++ 11 eine neue Verwendung für die Schlüsselwörter delete und default brachte, die der Syntax rein virtueller Funktionen ähnelt:

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

Siehe diese Frage und diese Frage für weitere Informationen zu dieser Verwendung von delete und default.

245
sbi

Für eine virtuelle Funktion müssen Sie die Implementierung in der Basisklasse bereitstellen. Die abgeleitete Klasse kann diese Implementierung jedoch durch ihre eigene Implementierung überschreiben. Normalerweise ist für reine virtuelle Funktionen keine Implementierung vorgesehen. Sie können eine Funktion rein virtuell machen mit =0 am Ende der Funktionsdeklaration. Auch eine Klasse, die eine rein virtuelle Funktion enthält, ist abstrakt, d. H. Sie können kein Objekt dieser Klasse erstellen.

29
Naveen

Eine rein virtuelle Funktion wird normalerweise nicht in einer Basisklasse implementiert (kann aber implementiert werden) und muss in einer Blattsubklasse implementiert werden.

Sie kennzeichnen diese Tatsache, indem Sie der Deklaration das "= 0" anhängen, wie folgt:

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

Dann können Sie eine Unterklasse nicht deklarieren und instanziieren, ohne die rein virtuelle Funktion zu implementieren:

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

Durch Hinzufügen des Schlüsselworts override stellt der Compiler sicher, dass eine virtuelle Basisklassenfunktion mit derselben Signatur vorhanden ist.

19
Johann Gerell

Sie können tatsächlich Implementierungen von rein virtuellen Funktionen bereitstellen in C++. Der einzige Unterschied besteht darin, dass alle reinen virtuellen Funktionen von abgeleiteten Klassen implementiert werden müssen, bevor die Klasse instanziiert werden kann.

8
AshleysBrain