Copy Konstruktor und Vererbung
-
camper schrieb:
Im Prinzip kann diese Problem in einem kompilierbaren Programm gar nicht auftreten, denn das bedeutet, dass clone_impl eine Überschreibung in einer nicht abstrakten Basisklasse hat - und die Ableitung von nicht-abstrakten Klassen in einer Hierarchie wird im LSP verletzen (oder trivial und daher überflüssig sein - so wie im Beispiel).
Das ist unsinnig. Man kann sehr wohl von einer konkreten Klasse erben, die schon die pure virtual Methode definiert hat, und dann kommt es möglicherweise zu Slicing. Es gibt in C++ kein Sprachkonstrukt, daß erzwingen würde, daß alle Klassen eine bestimme Methode redefinieren.
P.S. Mein Beispiel zeigt die Problematik übrigens auf.
-
@~john:
~john schrieb:
hustbaer schrieb:
@~john:
ad 2: Was wenn CloneExtendedContract NICHT der konkrete Typ ist, sondern selbst nur eine Basisklasse?
Dann passiert gar nichts, da man von abstrakten Typen keine Objekte erzeugen kann. Man kann in C++ Cloneable pure virtual machen und CloneableExtended ebenfalls. Gefährlich wird es nur bei konkrete Klasse erbt von konkreter Klasse, dann besteht die Gefahr, daß eine der Methoden nicht redefiniert wird. Also, muß man nur darauf achten, daß es in so einem Fall die Methode einer Klasse darüber (oder war's darunter) nicht mißbraucht werden kann. Code habe ich dazu ja gepostet.
Ich meinte genau den Fall dass eine konkrete Klasse von einer anderen konkreten Klasse abgeleitet ist. Du hast in deinem "Punkt 2" angesprochen man könnte ja den copy-ctor verwenden, ich wollte nur darauf hinweisen dass die Verwendung des copy-ctor eben in genau dem Fall zu slicing führen kann.
Weiters wundert es mich etwas dass du den Punkt anführst jmd. könnte vergessen die clone oder clone_impl Funktion zu überschreiben, da du mir ja einmal bei ähnlichen Bedenken vorgehalten hast das sei bloss ein "social engineering" Problem. Liegt hier auch nicht anders. (Davon abgesehen dass der Begriff IMO in beiden Fällen falsch angewendet ist)
Deine "slicing freie" Version funktioniert im Übrigen auch nur bis dorthin wo jmd. die "clone" Methode falsch implementiert (nämlich ohne das cloneObject Template zu verwenden). Wenn man davon dann eine weitere Klasse ableitet die clone nicht selbst implementiert krachts wieder.
-
Guten Morgen,
danke für die vielen Ideen...für die, die nachgefragt haben, wie das in C# funktioniert,
Object.MemberwiseClone() erstellt ein neues leeres Objekt von dem Objekt, dass übergeben wurde. (In C# kann man den Klassentyp mit obj.GetType() zur Laufzeit ermitteln und mit Activator.CreateInstanz einen Konstruktor aufrufen, egal ob sichtbar oder nicht). Anschließend werden alle Felder des Ursprungsobjekt auf das neue Objekt kopiert. (Ohne das, das in einem Copy-Konstruktor oder einer Clone-ähnlichen-Methode realisiert werden muss.)
-
hustbaer schrieb:
@~john:
Weiters wundert es mich etwas dass du den Punkt anführst jmd. könnte vergessen die clone oder clone_impl Funktion zu überschreiben, da du mir ja einmal bei ähnlichen Bedenken vorgehalten hast das sei bloss ein "social engineering" Problem. Liegt hier auch nicht anders. (Davon abgesehen dass der Begriff IMO in beiden Fällen falsch angewendet ist)Ja, in beiden Fällen ist das der Fall, und ja ich sehe das als ein social enginering Problem, denn es gibt Kollegen die nicht so sonderlich achtsam sind, um das Problem zurückhaltend zu umschreiben.
Deine "slicing freie" Version funktioniert im Übrigen auch nur bis dorthin wo jmd. die "clone" Methode falsch implementiert (nämlich ohne das cloneObject Template zu verwenden). Wenn man davon dann eine weitere Klasse ableitet die clone nicht selbst implementiert krachts wieder.
Stimmt, aber Cut&Paste ist eine sehr beliebte "Programmiertechnik", somit hat man das Risiko minimiert. In der Ursprungsfassung hatte ich dies nicht eingebaut, so minimiert man die Eigenleistung für diese Methode nur mit einer Template Klasse kann man das Problem wirklich umschiffen, aber kommen andere Dinge ins Spiel.
-
hustbaer schrieb:
@~john:
Ich meinte genau den Fall dass eine konkrete Klasse von einer anderen konkreten Klasse abgeleitet ist. Du hast in deinem "Punkt 2" angesprochen man könnte ja den copy-ctor verwenden, ich wollte nur darauf hinweisen dass die Verwendung des copy-ctor eben in genau dem Fall zu slicing führen kann.
Was meinst Du konkret damit?
Oder ist es der von mir skizzierte Fall gemeint?
-
~john schrieb:
hustbaer schrieb:
@~john:
Ich meinte genau den Fall dass eine konkrete Klasse von einer anderen konkreten Klasse abgeleitet ist. Du hast in deinem "Punkt 2" angesprochen man könnte ja den copy-ctor verwenden, ich wollte nur darauf hinweisen dass die Verwendung des copy-ctor eben in genau dem Fall zu slicing führen kann.
Was meinst Du konkret damit?
Oder ist es der von mir skizzierte Fall gemeint?Ja, der von dir skizzierte Fall war das was ich immer schon meinte. Dort kann es eben wie erwähnt zu slicing kommen, wenn man den copy-ctor verwendet.
-
OT: Das ist typisch C++ Programmierer. Ueber sowas triviales wie das Clonen von Objekten koennen sie 10 Seiten fuellen.

-
OT: Fresse, DEvent!

-
DEvent schrieb:
OT: Das ist typisch C++ Programmierer. Ueber sowas triviales wie das Clonen von Objekten koennen sie 10 Seiten fuellen.

... sprach der Ingenieur zum Mathematiker und teilte durch 0.

Gruß,
Simon2.