Objekt skivning
I C++- programmering sker objektsdelning när ett objekt av en subklasstyp kopieras till ett objekt av superklasstyp: superklasskopian kommer inte att ha någon av medlemsvariablerna eller medlemsfunktionerna definierade i underklassen. Dessa variabler och funktioner har i själva verket "skurits bort".
Mer subtilt kan objektsdelning på samma sätt inträffa när ett objekt av en underklasstyp kopieras till ett objekt av samma typ av superklassens tilldelningsoperator , i vilket fall några av målobjektets medlemsvariabler kommer att behålla sina ursprungliga värden istället för att kopieras över från källobjektet.
Det här problemet är inte i sig unikt för C++, men det förekommer inte naturligt i de flesta andra objektorienterade språk – inte ens i C++s släktingar som D , Java och C # – eftersom kopiering av objekt inte är en grundläggande operation i dessa språk.
Istället föredrar dessa språk att manipulera objekt via implicita referenser, så att endast kopiering av referensen är en grundläggande operation.
I C++, däremot, kopieras objekt automatiskt när en funktion tar ett objektsargument efter värde eller returnerar ett objekt efter värde.
Dessutom, på grund av bristen på sophämtning i C++, kommer program ofta att kopiera ett objekt närhelst äganderätten och livslängden för ett enskilt delat objekt skulle vara oklart. Till exempel, att infoga ett objekt i en standardbibliotekssamling (som en std::vector ) innebär faktiskt att man gör och infogar en kopia i samlingen.
Exempel
0
struct A { A ( int a ) : a_var ( a ) {} int a_var ; }; struct B : public A { B ( int a , int b ) : A ( a ), b_var ( b ) {} int b_var ; }; B & getB () { statisk B b ( 1 , 2 ); returnera b ; } int main () { // Normal tilldelning efter värde till a A a ( 3 ); //a.a_var == 3 a = getB (); // a.a_var == 1, b.b_var inte kopierad till en B b2 ( 3 , 4 ); //b2.a_var == 3 ,b2.b_var == 4 A & a2 = b2 ; // Partiell tilldelning efter värde genom hänvisning till b2 a2 = getB (); // b2.a_var == 1, b2.b_var == 4! återvända ; }
Se även
externa länkar
- Vad är skivningsproblemet i C++?
- geeksforgeeks.org/object-slicing-in-c/
- learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/