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% .
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?
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:
Sie kopieren das abgeleitete Objekt in die Basis. Es kopiert nur Basisfelder. Wenn Sie Polymorphismus wollen, versuchen Sie es als nächstes:
%Vor%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?
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%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.
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% .
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%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:
Sie kopieren das abgeleitete Objekt in die Basis. Es kopiert nur Basisfelder. Wenn Sie Polymorphismus wollen, versuchen Sie es als nächstes:
%Vor%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.