c ++ Polymorphie des Operators überladen

8

Wie kann ich rein virtuelle Funktion zu einem Operator machen + (); Funktion. wheh ich mag das in der Basisklasse int Operator + () = 0; Compiler gibt Fehler. in abgeleiteten Klasse Operator + () -Funktion Compiler sagen, dass die Klasse abzuleiten nicht möglich ist. weil der folgende Kurs abstrakt ist Ich weiß, dass ich kein Objekt von abstrakten Klassen erstellen kann, aber jetzt versuche ich, ein abgeleitetes Klassenobjekt zu erstellen.

Hier ist der Code

%Vor%     
hasan 03.06.2010, 21:38
quelle

6 Antworten

9

Ihre vagen Erwähnungen von Code sind im Wesentlichen unmöglich zu folgen. Beantworten Sie Ihre Frage "Wie kann ich rein virtuelle Funktion ein Operator + (); Funktion", gibt es absolut kein Geheimnis, z. Betrachten Sie das folgende triviale Programm:

%Vor%

Dies kompiliert und läuft gut und gibt 23 wie erwartet aus. Was auch immer es ist, dass Sie falsch arbeiten, es muss daher natürlich anders sein (und wahrscheinlich nicht mit dem spezifischen Problem einer Überlastung des Operators verbunden sein, rein virtuell zu sein).

Bearbeiten : (Wie in den Kommentaren, hinzugefügt const zu der Methode nur für den Fall, dass Sie es mit const base& nennen möchten - beachten Sie, dass andere Antworten auch diese% co_de weggelassen haben %, und auch pro Kommentar):

Wenn Sie auch const verwenden möchten, fügen Sie einfach eine eigenständige Funktion für diesen Zweck hinzu, sagen Sie kurz vor 15 + b :

%Vor%     
Alex Martelli 03.06.2010 21:48
quelle
4

Wenn Sie nach einer Standardoperator + () Implementierung suchen, dann ist das leider unmöglich:

%Vor%

Dieser Code kann nicht kompiliert werden, da der Compiler keine abstrakte X-Klasse nach Wert zurückgeben kann.

    
Kornel Kisielewicz 03.06.2010 21:48
quelle
2

Hinweis: Die Frage wurde aktualisiert, sodass diese Antwort weniger gültig ist.

Wenn Ihre Beschreibung korrekt ist, vergessen Sie nur, das Schlüsselwort virtual zu verwenden, um den Operator als virtuell zu definieren ...

%Vor%     
Klaim 03.06.2010 21:46
quelle
1

Ich sehe zwei Probleme, die Sie angehen oder zumindest besser verstehen sollten. Sie laufen beide darauf hinaus, dass Sie die reine virtuelle Deklaration in Ihrer Basisklasse ana :

nicht gelöst haben

1) operator + (): Ihre Klasse baba definiert einen anderen Operator + als die Basisklasse. Insbesondere ist ana::operator+() ein unärer + Operator (akzeptiert nur einen Operanden), während baba::operator+(baba& ali) ein binärer Operator (akzeptiert zwei Operanden) auf baba ist. Sie müssen entscheiden, was Sie verwenden und verwenden möchten. Wenn Sie das binäre + verwenden möchten (was Ihre Definition in baba ist, was ich denke, Sie wollen) dann deklarieren Sie in ana :

%Vor%

und in baba :

%Vor%

Warum dies eine rein virtuelle Methode in ana sein muss, da x in% definiert ist co_de% ist neugierig. Es wird interessante Dinge tun, wenn Sie andere abgeleitete Klassen haben, die die Dinge anders machen (Verlust der Kommutativität wird wahrscheinlich resultieren). Aber ich erwarte, dass du deine Gründe hast, also werde ich nicht weiter nachfragen.

2) operator = (ana & amp;): Sie haben auch ein Problem mit den Deklarationen des Zuweisungsoperators. Auch hier lösen Sie das reine virtuelle nicht auf. In ana haben Sie: ana während in virtual void operator=(ana&)=0; Sie haben: baba . Die Argumente sind unterschiedlich, da void operator=(baba &ali) nicht dasselbe ist wie baba& ; also ist die reine virtuelle Deklaration wieder nicht gelöst. Um dies zu beheben, möchten Sie wahrscheinlich die Deklaration in ana& zu:

ändern %Vor%

und in ana :

%Vor%

Ich habe ähnliche Bedenken, warum Sie dies als rein virtuell deklarieren wollen, da es wiederum annimmt, dass verschiedene abgeleitete Klassen es anders implementieren, was zu einem interessanten Verhalten führt. Ich bin sicher, du hast deine Gründe.

Ich hoffe, das hilft.

    
andand 04.06.2010 01:50
quelle
0

Die Syntax für eine reine virtuelle Funktion wäre etwa:

%Vor%

Beachten Sie jedoch, dass Sie dies nur selten tun möchten - normalerweise möchten Sie eine Überladung von operator+ als freie Funktion implementieren, um die Konvertierung des linken Operanden (falls erforderlich) zu ermöglichen.

    
Jerry Coffin 03.06.2010 21:45
quelle
0

%Vor%

int Haupt () { Baba k (4);

return 0; }<code>what is wrong here?     
hasan 03.06.2010 22:12
quelle