C ++ Unterschied zwischen virtuell = 0; und leere Funktion

7

Ich lerne jetzt C ++, die OO-Seite, und ich habe die ganze Zeit:

%Vor%

Mein Zweifel ist: Was ist der Unterschied zwischen den drei Methoden? Das virtuelle ist gleich null, das leere und das virtuelle, da es vererbt ist, leer.

Warum kann ich nicht einfach die SomeClassSon-Methode wie den Vater machen (virtual void ist gleich Null?)

    
Afonso Tsukamoto 25.02.2013, 20:11
quelle

6 Antworten

11

Für dein

%Vor%

Das Vorhandensein einer reinen virtuellen Methode macht Ihre Klasse abstrakt . Sobald Sie eine solche rein virtuelle Methode, =0 , in Ihrer Klasse haben, können Sie die Klasse nicht instanziieren. Darüber hinaus muss jede abgeleitete Klasse das reine virtuelle aMethod() implementieren, oder es wird auch eine abstrakte Klasse.

In Ihrer abgeleiteten Klasse überschreiben Sie die reine virtuelle Methode von oben, und dies macht die abgeleitete Klasse nicht abstrakt. Sie können diese abgeleitete Klasse instanziieren.

Aber in der abgeleiteten Klasse ist der Körper der Methode leer, oder? Deshalb macht Ihre Frage Sinn: Warum sollten Sie die Klasse nicht auch rein virtuell machen? Nun, deine Klasse kann andere Methoden beinhalten. Wenn dies der Fall ist, kann SomeClass nicht instanziiert werden (es gibt eine rein virtuelle Methode), wohingegen die Kindklasse SomeClassSon sein kann.

Gleiches gilt für Ihre AnotherClass , die im Gegensatz zu SomeClass instanziiert werden kann.

    
octoback 25.02.2013, 20:18
quelle
6

Der Unterschied ist, dass virtual void aMethod() = 0 eine reine virtuelle Funktion , was bedeutet:

  1. SomeClass wird zu einer abstrakten Basisklasse, was bedeutet, dass es nicht instanziiert werden kann.
  2. Jede Klasse, die von SomeClass erbt, muss aMethod implementieren, oder sie wird auch zu einer abstrakten Basisklasse, die nicht instanziiert werden kann

Beachten Sie, dass jede Klasse mit einer oder mehreren reinen virtuellen Funktionen automatisch eine abstrakte Basisklasse ist.

    
Charles Salvia 25.02.2013 20:15
quelle
3

Das "equals 0", auf das Sie sich beziehen, heißt " pure virtual ". Es ist eine Funktion, die das Kind, das instantiiert werden will, implementieren muss, anstatt Basisfunktionalität bereitzustellen, was bedeutet, dass die Elternklasse Funktionen definieren wird, die existieren müssen, aber dass die Eltern nicht wissen, wie das Kind es tun wird. Beachten Sie, dass die Klasse dadurch abstrakt wird, dass sie nicht instanziiert werden kann. Zum Beispiel möchte ich eine "Säugetier" -Klasse definieren, von der ich erben kann, und ich möchte, dass ihre Kinder auf eine bestimmte Art und Weise handeln - aber ich kann nicht einfach ein "Säugetier" machen. Stattdessen würde ich eine "Giraffe" -Klasse erstellen und sicherstellen, dass sie so funktioniert, wie sie sollte.

Es wird auch in dieser SO Frage erläutert.

Die Funktion "Empty", auf die Sie sich beziehen, ist stattdessen eine Funktion, bei der die Funktion definiert ist und aufgerufen werden kann - aber nichts tut.

    
McAden 25.02.2013 20:17
quelle
2

Die Deklaration aMethod () = 0 teilt dem Compiler mit, dass diese Methode in Unterklassen bereitgestellt werden muss. Jede Unterklasse, die die Methode nicht implementiert, kann nicht instanziiert werden. Dadurch können Sie sicherstellen, dass für alle Objekte der Basisklasse die Methode implementiert ist.

    
pahoughton 25.02.2013 20:16
quelle
1

Ein reines virtual macht die Klasse abstrakt. Eine leere nicht-virtuelle Methode tut nichts - es führt nur zu einem Linker-Fehler, wenn Sie versuchen, es aufzurufen. Im Gegensatz dazu können Sie nicht versuchen, ein reines virtual aufzurufen (es sei denn, Sie versuchen, es von einem Konstruktor aus aufzurufen, was ohnehin schlimm ist), weil der Compiler das Objekt nicht erstellen lässt.

Es gibt auch einen logischen Unterschied - die mit virtual markierte Methode wird virtuell über die Vererbungskette sein - die anderen sind nur normale Methoden.

    
Luchian Grigore 25.02.2013 20:15
quelle
1

Eine reine virtuelle Funktion (Ihr erstes Beispiel mit =0 ) bedeutet, dass die Funktion in einer abgeleiteten Klasse für ein Objekt dieser Klasse, die instanziiert werden soll, überschrieben werden muss.

Die zweite ist im Grunde nur eine Member-Funktion, die nichts tut. Da die Funktion einen anderen Namen hat und die Klasse nicht auf SomeClass bezogen ist, beeinflussen sich die beiden überhaupt nicht.

Der dritte Parameter überschreibt die reine virtuelle Funktion, daher ist es möglich, SomeClassSon zu instanziieren, aber in der abgeleiteten Klasse führt die überschriebene Funktion nichts aus.

    
Jerry Coffin 25.02.2013 20:15
quelle

Tags und Links