가상 함수
부모 클래스 포인터는 자식 관계에 있는 클래스들의 객체를 가리킬 수 있지만, 이 경우 부모 클래스에서 정의된 함수만 호출할 수 있다. 1
virtual 키워드를 사용하여 가상 함수를 선언함으로서 이러한 문제를 해결할 수 있다.
virtual 키워드는 다음과 같은 특징을 가진다.
- 가상 함수를 오버라이딩하는 함수는 자동으로 가상 함수가 된다 ( 하지만 코드의 명확성을 위해 virtual 키워드를 사용하여 명시하는 것이 좋다 ).
- 가상 함수는 해당 함수 호출 시, 포인터의 자료형을 기반으로 호출 대상을 결정하지 않고 포인터의 변수가 실제로 가리키는 객체를 참조하여 호출의 대상을 결정한다.
하나 이상의 가상 함수를 포함한 클래스를 ‘Polymorphic class’라고 한다.
가상 함수의 구체적인 작동 원리는 가상 함수 테이블을 참고하자.
순수 가상 함수(pure virtual function)
클래스 중에서는 객체생성이 목적이 아닌, 순수히 상속을 목적으로 정의된 클래스도 존재한다.
이러한 클래스를 객체로 선언하는 것은 바람직하지 않지만, 문법적으로는 아무런 이상이 없기 떄문에 고치기 쉽지 않다.
가상 함수를 순수 가상 함수로 선언하면 이러한 객체의 생성을 문법적으로 막을 수 있다.
순수 가상 함수란 함수의 몸체가 정의되어 있지 않은 함수를 의미한다. 이를 표현하기 위해서 함수의 몸체를 작성하지 않고 그 자리에 ‘0의 대입’을 표시한다.
virtual int GetPay() const = 0;
순수 가상 함수는 아래와 같은 이점을 가진다.
- 순수 가상 함수를 가진 클래스는 완전하지 않은 클래스로 간주되기 떄문에 객체를 생성하려 하면 컴파일 에러가 발생한다. 이를 이용해 잘못된 객체의 생성을 문법적으로 막는다.
- 순수히 상속만을 위한 클래스가 존재하는 것처럼, 함수를 순수 가상 함수로 선언함으로서 순수히 오버라이딩만을 위한 함수를 만들 수 있다.
하나 이상의 멤버 함수를 순수 가상 함수로 선언한 클래스를 가리켜 추상 클래스라 한다.
참고자료