Slicing-Problem
-
ich habe in mal gelesen über "Übergabe via Wert vs. Übergabe via Referenz"
Zusätzlich wird das sogenannte Slicing-Problem unterbunden: es bezeichnet den Umstand, dass bei einer Konvertierung in eine Basisklasse alle diejenigen Eigenschaften verloren gehen, die die abgeleitete Klasse ausgezeichnet haben. Bei der Referenzübergabe jedoch bleibt der originale Datentyp erhalten, selbst wenn in der Parameter-Liste nur eine Basisklasse verlangt wird. Bei einer Wertübergabe wäre dies nicht der Fall gewesen.
das verstehe ich nicht ganz
-
class A { public: A() : aval(0) {} int aval; virtual void print() { cout<<"A:"<<aval<<endl; }; class B : public A { public: B() : A(), bval(1) {} int bval; void print() { cout<<"B:"<<bval<<endl; A::print(); } }; void vfunc(A value) { value.print(); } void rfunc(A& value) { value.print(); } int main() { B theB; vfunc(theB); rfunc(theB); }bei der Übergabe als Wert wird 'theB' in ein A-Objekt kopiert, B-spezifische Elemente (bval) gehen dabei verloren, genauso würden bei virtuellen Funktionen die Versionen aus A aufgerufen werden.
bei der Übergabe als Referenz wird theB lediglich als A-Objekt interpretiert (und kann bei Bedarf auch wieder in ein B-Objekt gecastet werden), bval und virtuelle Funktionen bleiben dabei erhalten.