: 업캐스팅, 다운캐스팅, 깊은복사, 얕은 복사, 가상 함수, 순수 가상함수등을 공부하는 과제이다.
: 업캐스팅, 다운캐스팅, virtual키워드와 가상함수 및 가상 소멸자, 가상 함수 테이블등에 대해서 잘 나와있다.
링크1 : https://modoocode.com/210
링크2 : https://modoocode.com/211
: 업캐스팅, 다운캐스팅이 무엇인지에 대해서 공부할 수 있었다.
: 위 그림에서 보면 Base는 기반 클래스, 이를 상속받은 derived는 파생 클래스라고 한다. 파생클래스가 있었는데 이를 기반 클래스로 넣으면 이를 업캐스팅이라고 한다. 하지만 모든 기능을 수행을 할 수는 없다. Base는 위의 3개의 부분 밖에 가르키지 못하기 때문에 파생클래스를 넣었다고 하더라도 위의 3부분 만 가르키게 된다.
: 과제에서는 Animal이라는 기반클래스를 상속하는 Dog과 Cat이 나온다. 만약 업캐스팅을 한 뒤에 기반클래스와 파생클래스에 똑같은 함수(파생클래스에서는 오버라이딩 된 함수)가 있고, 기반클래스의 함수를 사용하지 않고, 파생클래스의 함수를 사용하고 싶다면 virtual 키워드를 활용하면 된다. 이 virtual keyword를 사용하지 않으면 기반클래스의 함수로 호출이 되게 된다.
: virtual 키워드를 사용할 때는 기반 클래스의 소멸자에 virtual keyword를 사용해주어야 한다. 이것을 해주지 않으면 파생클래스가 제대로 소멸되지 않는다.
: 클래스에 포인터가 있을때, 복사 생성자(copy constructor)와 복사대입연산자(copy assignment operator)에는 깊은 복사(deep copy)가 이루어 져야 한다.
: 클래스내에 클래스가 있을때는 소멸자에 해당되는 클래스도 같이 없애주어야 한다(delete)
: 순수 가상 함수에 대해서 배운다. 이제 기반 클래스에 나온 함수는 설계도라고 생각을 하면 편하다. 이런 함수가 파생된 클래스에서 쓰일 수도 있어라고 알려준다고 생각하면 된다.
virtual void function() = 0;
기본적으로 순수 가상함수의 형태는 이렇게 생겼다. 기반 클래스에 이런식으로 표기를 해두고, 파생클래스에서 이 함수를 재 정의를 해서 쓰게 된다.
: 머리로는 이해가 가지만 되돌아 오면 헷갈리는게 이 두개의 개념이다. 뒤에서도 둘을 활용하는 내용이 나온다. 특히 다운캐스팅은 사용을 하지 않도록 계속 권고가 되긴 한다. 업캐스팅 또한 왜 이것을 활용해야 되는지 아직도 잘 모르겠다.
: 과제에서는 업캐스팅의 활용이 아래와 같았다.
Animal *Animals[4];
for (int i = 0; i < 4; ++i)
{
if (i % 2 == 0)
Animals[i] = new Dog();
else
Animals[i] = new Cat();
}
위와 같이 기반 클래스의 Animal만 배열로 정의를 하고, 파생클래스인 Dog과 Cat을 배열에 집어 넣으면 하나의 배열에 두개의 기능을 할 수 있게 만들수 있다. 다양한 활용도가 있을 수 있는데 추가적으로 살펴봐야겠다.