오브젝트 슬라이스

Object slicing

C++ 프로그래밍에서 오브젝트 슬라이싱서브클래스 타입의 오브젝트가 슈퍼클래스 타입의 오브젝트로 복사될 때 발생합니다.슈퍼클래스 복사본은 서브클래스에 정의된 멤버 변수를 가지지 않습니다.이 변수들은 사실상 "소멸"되었다.

보다 미묘하게는 서브클래스 타입의 오브젝트가 슈퍼클래스의 할당 연산자에 의해 같은 타입의 오브젝트로 복사되었을 때 오브젝트 슬라이싱이 발생할 수 있습니다.이 경우 타깃 오브젝트의 멤버 변수 중 일부는 소스 오브젝트에서 복사되는 대신 원래 값을 유지합니다.

이 문제는 본질적으로 C++에만 있는 것은 아니지만 오브젝트 복사는 기본적인 조작이 아니기 때문에 다른 대부분의 오브젝트 지향 언어(D, Java, C# C++의 친척 언어에서도 마찬가지)에서는 자연스럽게 발생하지 않습니다.

대신, 이러한 언어들은 암묵적인 참조를 통해 객체를 조작하는 것을 선호하며 참조를 복사하는 것만이 기본 작업입니다.

반면 C++에서는 함수가 값으로 객체 인수를 받거나 값으로 객체를 반환할 때마다 객체가 자동으로 복사됩니다.

또한 C++에는 가비지 컬렉션이 없기 때문에 프로그램은 공유 객체의 소유권과 수명이 불분명할 때마다 객체를 자주 복사합니다.예를 들어 표준 라이브러리 컬렉션에 객체 삽입(예:std::contractions)는 실제로 복사본을 만들어 컬렉션에 삽입하는 작업을 수행합니다.

구조 A {     A(인트 a) : a_var(a) {}     인트 a_var; };  구조 B : 일반의 A {     B(인트 a, 인트 b) : A(a), b_var(b) {}     인트 b_var; };  B &B를 취득하다() {     정적인 B b(1, 2);     돌아가다 b; }  인트 주된() {     // 에 대한 값별 일반 할당     A a(3);     //a.a_var == 3     a = B를 취득하다();     // a.a_var == 1, b.b_var가 a에 복사되지 않음      B b2(3, 4);     //b2.a_var == 3, b2.b_var == 4     A &a2 = b2;     // b2 참조를 통한 값별 부분 할당     a2 = B를 취득하다();     // b2.a_var == 1, b2.b_var == 4!      돌아가다 0; } 

「 」를 참조해 주세요.

외부 링크