오브젝트 슬라이싱 - 객체 slice

보물창고·2021년 8월 15일
0

상속의 문제점

  • 상속에서만 발생하는 문제.

문제점 1. 오브젝트 슬라이싱

  • 오브젝트 슬라이싱 예시를 위해서 추상클래스가 아닌 그냥 부모 클래스로 만듬
    (추상클래스는 부모 클래스로 객체 생성이 불가능하므로)


-> animal을 객체로 선언하면 딱 Animal 멤버 크기만큼의 데이터가 할당되므로,
Lion a로 선언한 데이터 중 파생클래스의 데이터가 잘리는 것이다.
이 때 복사 생성자로 호출되면서 Animal의 mName은 copy가 일어난다.
animalObj의 가상함수 포인터는 Animal 클래스의 가상함수 포인터를 가리키게 된다.

오브젝트 슬라이싱은 파생객체에서 부모 객체로 copy가 될 때 파생클래스의
정보를 잘려나간다는 것이다.

  • 가장 많이 하는 실수
    : 부모 클래스를 call by value 로 받을경우, 오브젝트 슬라이싱이 발생한다.

but, 레퍼런스와 포인터로 받으면 발생하지 않음.

  • 오브젝트 슬라이싱을 방지하기 위한 방법
    : 복사로 인해 발생한 것이므로 부모 클래스에 복사생성자와 복사 대입생성자 생성을 막자.


-> 추가하면 컴파일러가 원천적으로 막아준다.

그런데 이 방법의 문제는 파생클래스 간의 복사 또한 막아준다.
이를 해결하기 위해서는 복사생성자를 protected로 위치시킴으로써 해결이 가능하다.

  • 파생 객체간 복사가 안됨.

  • 해결완료

문제점 2. 기본클래스 간의 == 연산자 사용시 문제가 있다.

  • == 연산자 비교를 위해 함수를 따로 만들어야 한다.

  • 부모 클래스만 비교해서 동일하다는 결과가 나온다.

  • 파생클래스를 비교하는 함수까지 만들면 해결 완료!

결과 : 하지만 뭐니뭐니 해도 가장좋은 방법은!

기본 클래스를 추상클래스로 사용하는 것이다.
그러면 오브젝트 슬라이싱이 발생하지 않고,
operator 오버로딩 문제도 발생하지 않는다.

profile
🔥🔥🔥

0개의 댓글