상속 - 순수 가상 함수
#include <iostream>
#include <random>
// [문제] 사용자의 입력을 받아 동물을 수용하려고 한다.
// Animal은 추상클래스 (abstract class)로 만들자.
// - 순수 가상 함수가 있는 클래스는 추상클래스이다.
// - 추상 클래스는 객체로 만들 수 없다.
// - 확정되어 있지 않다.
// - 추상 클래스는 interface를 강제한다.
class ANIMAL {
public:
ANIMAL() {};
virtual ~ANIMAL() {};
virtual void move() const = 0; // 순수 가상 함수 ( Pure Virtual Function )
// 본문이 아예 없게 만들자 -> 그래도 되나?
};
class DOG : public ANIMAL {
public:
DOG() {};
virtual ~DOG() override {};
virtual void move() const override { std::cout << " DOG MOVE " << std::endl; }
};
class BIRD : public ANIMAL {
public:
BIRD() {};
virtual ~BIRD() override {};
virtual void move() const override { std::cout << " BIRD MOVE " << std::endl; }
};
typedef ANIMAL* ROOM;
int main() {
std::default_random_engine dre;
std::uniform_int_distribution uid(0, 1);
while (true) {
int num;
std::cout << " 모두 몇 마리입니까? ";
std::cin >> num;
// num 마리의 동물을 수용할 공간을 확보한다.
ROOM *animals = new ROOM[num];
// ANIMAL ** room = new ANIMAL * [num];
// 각 공간에 랜덤하게 Dog와 Bird를 배치하자.
for (int i = 0; i < num; ++i) {
// 업 캐스팅 동작
if (0 == uid(dre)) animals[i] = new DOG;
else animals[i] = new BIRD;
}
// 객체가 개인 경우만 움직이게 하라.
for (int i = 0; i < num; ++i) {
std::cout << i << " -> ";
// i번째 동물 -> move()를 호출해보자.
// p가 가리키는 객체가 DOG 인가?
// 실제로 비용이 많이 드는 동작이다.
if (DOG * pd = dynamic_cast (animals[i])) {
pd->move();
}
}
for (int i = 0; i < num; ++i) {
delete animals[i];
}
delete[] animals;
}
}