# 가상함수 (Virtual Function)
## 개요
```
class Animal {
public:
virtual void breathe();
};
class Fish : public Animal {
public:
virtual void breathe();
}
```
- 실행 시 사용된 객체에 의해 실행 코드가 결정되는 함수이다.
- 상속받은 객체에서 부모객체의 가상함수를 재정의하면 자동으로 가상함수로 처리된다.
- 하지만 상속클래스에서 가상함수를 재정의할때에도 virtual을 명시해주는것이 좋다.
## 가상함수의 호출
```
Animal *a = new Fish;
a->breathe() // Fish::breathe() 호출
```
부모클래스의 포인터가 자식 클래스의 객체를 가리킬때, 포인터를 사용하여 호출하면
파생 클래스에서 재정의한 함수가 호출된다.
# 순수가상함수 (Pure Virtual Function)
```
class Person
{
public:
virtual void VirtualMethod() = 0;
};
```
순수가상함수는 자식클래스에게 이러한 함수를 호출해야한다는 일종의 인터페이스를 제공한다.
순수가상함수가 정의된 클래스는 인스턴스화 할 수 없으며 실제 구현은 자식 클래스에서 구현해야
한다.