Frage

Was ist der Unterschied zwischen den beiden folgenden Erklärungen?

virtual void calculateBase() = 0;  
virtual void calculateBase();

las ich die erste (= 0) ist eine „reine abstrakte Funktion“ aber was bedeutet, dass die zweite machen?

War es hilfreich?

Lösung

Das erste ist eine rein virtuelle Funktion aufgerufen. Normalerweise rein virtuelle Funktionen werden keine Implementierung haben, und Sie können eine Instanz einer Klasse, die eine rein virtuelle Funktion.

erstellen

Der Zweite ist eine virtuelle Funktion (das heißt eine ‚normale‘ virtuelle Funktion). Eine Klasse stellt die Implementierung für diese Funktion, aber die abgeleitete Klasse kann diese Implementierung überschreiben, indem eine eigene Implementierung für diese Methode bereitstellt.

Andere Tipps

Die erste ist eine „reine virtuelle“ - es wird die Klasse abstrakt machen, zu instanziiert versuchen, es in Compiler-Fehler führen wird. Es soll als Basisklasse verwendet werden, in denen die abgeleitete Klasse das notwendige Verhalten implementiert, indem die rein virtuelle Funktion zu implementieren. Sie müssen nicht die Funktion in der Basisklasse implementieren, wenn Sie können.
Dies ist ein Muster oft für zwei Entwurfsmuster verwendet:

  • Die „Template-Methode“ Entwurfsmuster, in dem die Basisklasse eine Struktur um ein implementiert Funktionsaufruf, aber die Details des Funktionsaufrufs ausgefüllt von der abgeleiteten Klasse werden müssen, und
  • Die „Schnittstelle“ Entwurfsmuster, weil C ++ nicht über die Schnittstelle Schlüsselwort. Abstrakte Basisklassen, idealerweise mit nur rein virtuellen Funktionen und keine Mitgliederdaten, sind die C ++ Art und Weise Schnittstellen zu definieren.

Die zweite Erklärung ist nur eine gewöhnliche virtuelle Member-Funktion Erklärung. Sie werden Compiler-Fehler erhalten, wenn Sie nicht die Member-Funktion in der Basisklasse zu implementieren. Es ist immer noch virtuell was bedeutet, dass es nützlich sein kann, um das Verhalten in einer abgeleiteten Klasse außer Kraft zu setzen.

Die erste muss nicht in der Basisklasse implementiert wird, sondern erzwingt es in geerbten Klassen umgesetzt werden.

Sie haben die zweite in der Basisklasse zu implementieren und es kann in geerbten Klassen implementiert werden.

Grundsätzlich, wenn vererben, Sie sind gezwungen die ersten zu überschreiben, und erlaubt die zweiten außer Kraft zu setzen.

Von Java, nicht wahr?

Ich glaube, Sie Begriffe mischen ...

virtual void x() = 0;

ist eine rein virtuelle Funktion , oder abstrakte Funktion. Es ist eine virtuelle Funktion ohne Umsetzung. Sie sprechen von einer reinen abstrakten Klasse, die die c ++ äquivalent eine Schnittstelle ist, um eine Klasse nur abstrakte Funktionen.

virtual void x();

ist eine virtuelle Funktion, das heißt, es kann in abgeleiteten Klassen neu definiert werden, aber es ist nicht abstrakt, so dass Sie eine Implementierung für sie zur Verfügung stellen muss.

  

virtual void calculateBase () = 0;

Die erste Funktion ist rein virtuelle Funktion, wo die Umsetzung nicht in der Klasse getan werden kann und es als reine abstrakte Klasse oder Schnittstelle Klasse handeln. Die konkrete Umsetzung sollte in der Unterklasse erfolgen oder außer Kraft gesetzt werden. Es fungiert als Schnittstelle Klasse seine abgeleiteten Klassen.

  

virtual void calculateBase ();

Diese Funktion ist virtuelle Funktion, bei der Implementierung (default) kann in der Basisklasse erfolgen. Aber muss die abgeleitete Klasse eine eigene imeplementation außer Kraft gesetzt werden.

In Java

virtual void calculateBase() = 0;  

wäre

abstract void calculateBase();

und

virtual void calculateBase();

wäre

void calculateBase();

Um vollkommen klar,

void calculateBase();

in C ++, ist "die gleiche" wie

final void calculateBase();

in Java. Das heißt, endgültig ist "default" in C ++. Es gibt eine Ausnahme jedoch von dieser Regel. Wenn eine Klasse mit einer virtuellen Methode Subklassen und es ohne das Schlüsselwort virtual Neuimplementierung wird das Verfahren in der Unterklasse nicht ist endgültig.

Die zweite Funktion ist eine Implementierung in der Klasse, die es (fehlende '= 0') zu erklären, und kann von Subklassen außer Kraft gesetzt werden.

Die erste Funktion kann oder auch nicht eine Implementierung in der Klasse, die sie erklärt, und hat von Subklassen umgesetzt werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top