Was ist der Unterschied zwischen der abstrakten Klasse und der reinen abstrakten Klasse in C ++?

8

Ich habe meine Hauptfrage im Titel gestellt. Ich wiederhole es nicht. (TROCKEN: D)

Bearbeiten: Beispiel:

  

Iteratoren sind reine Abstraktionen: Alles, was sich wie ein   Iterator ist ein Iterator.

Was heißt das?

    
Milad Khajavi 06.03.2013, 17:09
quelle

7 Antworten

24

Eine abstrakte Klasse hat mindestens eine reine virtuelle Funktion. Dies ist Standard C ++ Terminologie.

Manche Leute verwenden den Begriff reine abstrakte Klasse , um eine Klasse zu beschreiben, die rein virtuelle Funktionen hat (also keine Datenelemente und keine konkreten Funktionen). Dies entspricht Java-Schnittstellen.

Nun zu Ihrer eigentlichen Frage:

  

Iteratoren sind reine Abstraktionen: Alles, was sich wie ein Iterator verhält, ist ein Iterator.

Das hat nichts mit abstrakten Klassen (rein oder anders) zu tun. Alles, was gesagt wird, ist, dass alles, was den Iterator-Vertrag erfüllt, ein Iterator ist. Es muss nicht einmal eine Klasse sein (think pointer).

    
NPE 06.03.2013, 17:11
quelle
14

Nichts. Der C ++ - Standard besagt nur, dass a) eine Klasse abstrakt ist, wenn sie mindestens eine reine virtuelle Funktion besitzt, direkt oder geerbt, und b) Sie eine abstrakte Klasse nicht direkt instanziieren können. Es gibt keine reine abstrakte Klasse.

    
Puppy 06.03.2013 17:12
quelle
5

Eine abstrakte Klasse ist eine Klasse mit einigen Funktionen, aber einige müssen implementiert werden, während eine reine abstrakte Klasse keine ihrer Funktionen implementiert hat.

Dies ist ein bisschen wie eine Schnittstelle in anderen Sprachen wie C # und Java.

Eine reine abstrakte Klasse würde dem Zweck dienen, einen "Vertrag" zu spezifizieren, an den sich die Konkretionen der reinen abstrakten Klasse halten müssen.

    
Paul T Davies 06.03.2013 17:12
quelle
4

Ich würde denken, dass eine reine abstrakte Klasse das C ++ - Äquivalent einer Schnittstelle ist.

Siehe hier :

  

Eine reine abstrakte Klasse hat nur abstrakte Elementfunktionen und keine Daten   oder konkrete Mitgliedsfunktionen. Im Allgemeinen ist eine reine abstrakte Klasse   verwendet, um eine Schnittstelle zu definieren und soll vererbt werden   konkrete Klassen. Es ist eine Möglichkeit, einen Vertrag zwischen der Klasse zu erzwingen   Designer und die Benutzer dieser Klasse. Die Benutzer dieser Klasse müssen   Deklarieren Sie eine übereinstimmende Elementfunktion für die zu kompilierende Klasse.

    
Vlad 06.03.2013 17:12
quelle
1

Abstrakte Klasse * hat mindestens eine reine virtuelle Funktion und kann Datenelemente haben.

Pure Abstract Class ist genau wie eine Schnittstelle . Hier können nur reine virtuelle Funktionen definiert werden. Hier können keine Datenelemente oder Methodendefinitionen vorgenommen werden.

Weitere Informationen finden Sie unter: ( Ссылка )

    
CasperGhost 06.03.2013 17:47
quelle
0

In C ++ gibt es keine reine abstrakte Klasse. Es gibt nur abstrakte Klasse und reine virtuelle Funktion (Funktion wurde mit = 0 markiert). Klasse mit mindestens einer reinen virtuellen Funktion wird abstrakt. Die reine virtuelle Funktion kann jedoch implementiert werden.

    
AnatolyS 06.03.2013 17:17
quelle
0

In Ihrem Beispiel sprechen Sie von Iteratoren . In C ++ und genauer in der Standardbibliothek bezieht sich der Begriff Iteratoren nicht auf eine reine abstrakte Klasse, sondern auf sogenannte Konzepte . Konzepte werden eher mit Vorlagen als mit virtuellem / vererbungsbasierten Polymorphismus verwendet. Gegenwärtig (C ++ 11) sind Konzepte nur in der Bibliotheksdokumentation definiert, d.h. sie existieren (noch) nicht als Teil der C ++ - Sprache selbst. Die Standardbibliothek dokumentiert Konzepte, zB das "Iterator" -Konzept, als eine Menge von Anforderungen für beliebige Typen / Objekte, die als Typparameter einer Vorlage akzeptiert werden, die mit einem "Iterator" arbeiten wollen. . Ein Satz von Anforderungen wird definiert in Bezug darauf, welche Ausdrücke unabhängig von ihrem Typ für ein Objekt gültig sind. Es ist eine Form der Entenschrift. Zum Beispiel: Ссылка

    
Johan Boulé 16.05.2014 22:25
quelle