Cięcie obiektu
W programowaniu w języku C++ cięcie obiektów występuje, gdy obiekt typu podklasy jest kopiowany do obiektu typu nadklasy: kopia nadklasy nie będzie miała żadnych zmiennych składowych ani funkcji składowych zdefiniowanych w podklasie. Te zmienne i funkcje zostały w efekcie „wycięte”.
Bardziej subtelnie, dzielenie obiektów może również wystąpić, gdy obiekt typu podklasy jest kopiowany do obiektu tego samego typu przez operator przypisania nadklasy , w którym to przypadku niektóre zmienne składowe obiektu docelowego zachowają swoje oryginalne wartości zamiast zostać skopiowane z obiektu źródłowego.
Ten problem nie jest z natury unikalny dla C++, ale nie występuje naturalnie w większości innych języków zorientowanych obiektowo — nawet w krewnych C++, takich jak D, Java i C # — ponieważ kopiowanie obiektów nie jest podstawową operacją w tych językach.
Zamiast tego języki te wolą manipulować obiektami za pomocą niejawnych odniesień, tak że tylko kopiowanie odniesienia jest operacją podstawową.
Z kolei w języku C++ obiekty są kopiowane automatycznie, gdy funkcja przyjmuje argument obiektu według wartości lub zwraca obiekt według wartości.
Dodatkowo, ze względu na brak wyrzucania elementów bezużytecznych w C++, programy często kopiują obiekt, gdy własność i czas życia pojedynczego udostępnionego obiektu byłyby niejasne. Na przykład wstawienie obiektu do kolekcji standardowej biblioteki (takiej jak std::vector ) w rzeczywistości obejmuje wykonanie i wstawienie kopii do kolekcji.
Przykład
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
() { statyczny B b ( 1 , 2 ); powrót b ; } int main () { // Normalne przypisanie przez wartość do A a ( 3 ); //a.a_var == 3 a = getB (); // a.a_var == 1, b.b_var nie skopiowano do B b2 ( 3 , 4 ); //b2.a_var == 3 ,b2.b_var == 4 A & a2 =
0
b2 ; // Częściowe przypisanie według wartości poprzez odwołanie do b2 a2 = getB (); // b2.a_var == 1, b2.b_var == 4! powrót ; }
Zobacz też
Linki zewnętrzne
- Jaki jest problem z krojeniem w C++?
- geeksforgeeks.org/object-slicing-in-c/
- Learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/