Überschreibe das Memberfeld in abgeleiteten Klassen

7

Ich habe unten ein Code-Snippet:

%Vor%

Führen Sie die kompilierte ausführbare Datei aus, und ich finde, dass das Ergebnis meiner Erwartung auf meinem llvm-g ++ 4.2 Computer nicht entspricht. Die Ausgabe auf meiner Box ist wie

%Vor%

Was ich im Code tun möchte, ist ein Memberfeld ( b ) in Derived class zu überschreiben. Da ich denke, dass Base und Derived auf dieses Feld zugreifen müssen, definiere ich eine get -Memberfunktion in Base , also kann Derived sie erben. Dann versuche ich das Mitgliederfeld von verschiedenen Objekten zu bekommen.

Das Ergebnis zeigt, dass ich immer noch b in Base by d.get() anstelle von Derived bekomme, was ich von dem Code erwartet habe. Irgendwas stimmt nicht mit dem Code (oder meinem Verständnis)? Ist dieses Verhalten in der Spezifikation angegeben? Was ist der richtige Weg, um ein Member-Feld zu überschreiben und seinen Getter und Setter richtig zu definieren?

    
Summer_More_More_Tea 10.10.2013, 08:31
quelle

4 Antworten

9
___ answer19291118 ___

Sie sollten Ihren Derived :: ctor wie folgt umschreiben:

%Vor%

Und entfernen Sie das Feld b in der abgeleiteten Klasse. Markieren Sie stattdessen b in der Klasse b als geschützt.

BEARBEITEN
Ignoriere all dies Ich habe ein Problem in Ihrem Code gefunden:

%Vor%

Sie kopieren das abgeleitete Objekt in die Basis. Es kopiert nur Basisfelder. Wenn Sie Polymorphismus wollen, versuchen Sie es als nächstes:

%Vor%     
___ qstntxt ___

Ich habe unten ein Code-Snippet:

%Vor%

Führen Sie die kompilierte ausführbare Datei aus, und ich finde, dass das Ergebnis meiner Erwartung auf meinem llvm-g ++ 4.2 Computer nicht entspricht. Die Ausgabe auf meiner Box ist wie

%Vor%

Was ich im Code tun möchte, ist ein Memberfeld ( b ) in %code% class zu überschreiben. Da ich denke, dass %code% und %code% auf dieses Feld zugreifen müssen, definiere ich eine %code% -Memberfunktion in %code% , also kann %code% sie erben. Dann versuche ich das Mitgliederfeld von verschiedenen Objekten zu bekommen.

Das Ergebnis zeigt, dass ich immer noch %code% in %code% by %code% anstelle von %code% bekomme, was ich von dem Code erwartet habe. Irgendwas stimmt nicht mit dem Code (oder meinem Verständnis)? Ist dieses Verhalten in der Spezifikation angegeben? Was ist der richtige Weg, um ein Member-Feld zu überschreiben und seinen Getter und Setter richtig zu definieren?

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___ answer19290959 ___

Sie können ein Memberfeld nicht einfach überschreiben, und da %code% kompiliert wird, wird die Variable %code% in %code% aufgelöst, so dass diese Methode immer diesen Wert und nicht einen Wert aus einem anderen Feld mit demselben Wert verwendet Name in einer abgeleiteten Klasse.

Die übliche Methode zum Überschreiben eines Attributs besteht darin, die Zugriffsmethode zu überschreiben, d. h. die Zugriffsmethoden (Getter und Setter) zu überschreiben.

Sie können so etwas erreichen, indem Sie den Getter dekorieren, aber der Getter-Return-Typ wird immer der gleiche sein:

%Vor%     
___ answer19291038 ___

Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber mit "überschreiben" meinst du "ersetzen", du würdest eine Vorlage verwenden:

%Vor%

Sie Code in %code% versuchte auch %code% , was zu Slicing führen würde, das obige behebt das und stellt sicher, dass Sie nicht versehentlich %code% anstelle von %code% verwenden.

Live-Beispiel

    
___ antwort19290950 ___

Das neue %code% , das in der abgeleiteten Klasse hinzugefügt wurde, überschreibt das %code% der Basis nicht. Es wird nur versteckt .

In der abgeleiteten Klasse haben Sie also zwei %code% und die virtuelle Methode druckt entsprechend %code% .

    
___ qstnhdr ___ Überschreibe das Memberfeld in abgeleiteten Klassen ___
deepmax 10.10.2013, 08:38
quelle
7

Sie können ein Memberfeld nicht einfach überschreiben, und da Base::get kompiliert wird, wird die Variable b in Base::b aufgelöst, so dass diese Methode immer diesen Wert und nicht einen Wert aus einem anderen Feld mit demselben Wert verwendet Name in einer abgeleiteten Klasse.

Die übliche Methode zum Überschreiben eines Attributs besteht darin, die Zugriffsmethode zu überschreiben, d. h. die Zugriffsmethoden (Getter und Setter) zu überschreiben.

Sie können so etwas erreichen, indem Sie den Getter dekorieren, aber der Getter-Return-Typ wird immer der gleiche sein:

%Vor%     
Geoffroy 10.10.2013 08:39
quelle
2

Sie sollten Ihren Derived :: ctor wie folgt umschreiben:

%Vor%

Und entfernen Sie das Feld b in der abgeleiteten Klasse. Markieren Sie stattdessen b in der Klasse Base als geschützt.

BEARBEITEN
Ignoriere all dies Ich habe ein Problem in Ihrem Code gefunden:

%Vor%

Sie kopieren das abgeleitete Objekt in die Basis. Es kopiert nur Basisfelder. Wenn Sie Polymorphismus wollen, versuchen Sie es als nächstes:

%Vor%     
zabulus 10.10.2013 08:47
quelle
1

Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber mit "überschreiben" meinst du "ersetzen", du würdest eine Vorlage verwenden:

%Vor%

Sie Code in main versuchte auch Base b = d; , was zu Slicing führen würde, das obige behebt das und stellt sicher, dass Sie nicht versehentlich Base<int> anstelle von Base<double> verwenden.

Live-Beispiel

    
Daniel Frey 10.10.2013 08:43
quelle

Tags und Links