Das Gegenstand-Schneiden

In der objektorientierten Programmierung erweitert eine Unterklasse normalerweise seine Superklasse durch das Definieren von zusätzlichen Mitglied-Variablen. Wenn ein Superklassenbeispiel sein Wert von einem Unterklasse-Beispiel zugeteilt wird, können in der Unterklasse definierte Mitglied-Variablen nicht kopiert werden, da die Superklasse keinen Platz hat, sie zu versorgen. Das ist eine natürliche und unvermeidliche Folge der Anweisung durch den Wert von Unterklasse-Gegenständen. Das Begriff-Gegenstand-Schneiden wird manchmal verwendet, um sich auf diesen Aspekt der Anweisung durch den Wert zu einem Superklassenbeispiel zu beziehen.

Das Gegenstand-Schneiden wird auch verwendet, um sich auf einen feineren, problematisches, Fall zu beziehen, in dem eine Gegenstand-Anweisung durch den Wert scheint, zu einem Superklassenbeispiel zu sein, aber wirklich zu einem Unterklasse-Beispiel ist. Von der Perspektive des Gegenstand-Speicherlay-Outs kann von den Mitglied-Variablen des Quellbeispiels als gedacht werden, "abgeschnitten" worden sein, die entsprechenden Mitglied-Variablen im Bestimmungsort-Beispiel unverändert verlassend. Es ist diese teilweise Anweisung (wohl ein passenderer Begriff), der häufig Programmierer überrascht und zu unbeabsichtigten Folgen führt.

Das unerwartete Gegenstand-Schneiden kann auf Sprachen wie C ++ geschehen, in dem die Anweisung durch den Wert nicht polymorph ist. Es ist in Java nicht möglich, das Gegenstand-Anweisung nur durch die Verweisung oder die D Programmiersprache erlaubt, die Gegenstand-Erbe nur durch Bezugstypen erlaubt.

Beispiel in C ++

struct Ein

{\

(Interne Nummer a): a_var (a) {}\

interne Nummer a_var;

};

struct B: Publikum Ein

{\

B (interne Nummer a, interne Nummer b): (A), b_var (b) {}\

interne Nummer b_var;

};

B &getB

{\

statischer B b (1, 2);

geben Sie b zurück;

}\

int Haupt(Leere)

{\

//Normale Anweisung durch den Wert zu einem

(3);

a = getB ;

//a_var == 1, b.b_var nicht kopiert zu einem

B b2 (3, 4);

&a2 = b2;

//Teilweise Anweisung durch den Wert durch die Verweisung auf b2

a2 = getB ;

//b2.a_var == 1, b2.b_var == 4!

kehren Sie 0 zurück;

}\

</syntaxhighlight>

Siehe auch

  • Diamantproblem

Jo-Jo-Problem / Schablone metaprogramming
Impressum & Datenschutz