-> animal을 객체로 선언하면 딱 Animal 멤버 크기만큼의 데이터가 할당되므로,
Lion a로 선언한 데이터 중 파생클래스의 데이터가 잘리는 것이다.
이 때 복사 생성자로 호출되면서 Animal의 mName은 copy가 일어난다.
animalObj의 가상함수 포인터는 Animal 클래스의 가상함수 포인터를 가리키게 된다.
오브젝트 슬라이싱은 파생객체에서 부모 객체로 copy가 될 때 파생클래스의
정보를 잘려나간다는 것이다.
but, 레퍼런스와 포인터로 받으면 발생하지 않음.
-> 추가하면 컴파일러가 원천적으로 막아준다.
그런데 이 방법의 문제는 파생클래스 간의 복사 또한 막아준다.
이를 해결하기 위해서는 복사생성자를 protected로 위치시킴으로써 해결이 가능하다.
파생 객체간 복사가 안됨.
해결완료
== 연산자 비교를 위해 함수를 따로 만들어야 한다.
부모 클래스만 비교해서 동일하다는 결과가 나온다.
파생클래스를 비교하는 함수까지 만들면 해결 완료!
기본 클래스를 추상클래스로 사용하는 것이다.
그러면 오브젝트 슬라이싱이 발생하지 않고,
operator 오버로딩 문제도 발생하지 않는다.