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