객체 포인터로 객체를 가리킬 경우 포인터형에 해당하는 클래스의 멤버에만 접근가능하다.
따라서
int main()
{
Base* ptr1 = new Derived();
ptr1->TestOverride();
}
위와 같이 실행시 Derived의 OverrideTest가 호출되는 것이 아닌 Base의 Override가 호출된다.
virtual void OverrideTest() { ... }
위와 같이 virtual 키워드를 통해 함수를 선언하고 함수 오버라이딩을 한다면
int main()
{
Base* ptr1 = new Derived();
ptr1->TestOverride();
}
위의 경우에도 Derived의 OverrideTest가 호출된다.
virtual로 선언한 함수를 가상함수 라고 한다.
가상함수는 포인터 형에 관계없이 포인터가 가리키는 객체의 마지막 오버라이딩 함수를 호출한다.
따라서 기초클래스의 포인터로도 유도클래스의 멤버함수를 호출할 수 있게된다.
가상함수에서 몸체의 정의로 빼버린 함수
virtual void OverrideTest() = 0;
{ } 대신 =0을 넣어준다.
순수 가상함수가 있는 클래스는 추상클래스라고 부른다.
추상클래스는 객체생성이 불가하다.