유도 클래스는 기본 클래스 의 멤버 함수를 직접 호출 가능
유도 클래스는 기본 클래스의 멤버 함수를 오버라이드 또는 재정의 가능
다형성의 구현을 위해 중요한 기능
#include <iostream>
class Entity
{
protected:
int x, y;
public:
Entity(int x , int y)
:x{x},y{y}{}
void showPosition()
{
std::cout << "[" << x << "," << y << "]" << std::endl;
}
void talk()
{
std::cout << "Hello" << std::endl;
}
};
class Player :public Entity
{
private:
int hp, xp, speed;
public:
Player(int x, int y , int speed)
: Entity{x,y},speed{speed}{}
void Move(int dx, int dy)
{
x += dx;
y += dy;
}
void talk() // 동일한 함수명 존재
{
std::cout << "Hello I'm Player!!" << std::endl;
}
};
int main()
{
Player p{ 5,5,10 };
p.talk();
}
위의 코드에서 Base class와 Derived class가 동일한 이름의 함수 talk()가 존재할 때 어떤 기준으로 호출할 함수를 결정할 것 인가 정해야 한다. → 타입을 기준 호출한다.
int main()
{
Player p{ 5,5,10 };
p.talk();
Entity e{ 1,1 };
e = p; //오류 발생 하지 않는다.
e.talk();
}
그럼 아래와 같은 상황도 한번 고민해 보자
Player p{ 5,5,10 };
p.talk();
Entity e{ 1,1 };
e.talk();
Entity* eptr = new Player{1,1,2};
eptr -> talk(); //???
void TalkSomething(Entity e)
{
e.talk();
}
void ShowSomething(Entity e)
{
e.showPosition();
}
int main()
{
Player p{ 0,0,1 };
TalkSomething(p); //가능
ShowSomething(p); //가능
}
- 기본 클래스 객체를 사용하는 곳에는 항상 유도 클래스 객체를 사용 가능
- 유도 클래스에 기본 클래스의 멤버가 모두 포함되기 때문에
- Player 객체는 두 가지 타입을 모두 가진 상태가 됨!