계층구조를 갖는 객체들을 클래스로 표현할 때 실제로 객체가 존재하지 않는 추상적인 개념에 대한 클래스가 필요한 경우가 있다.
클래스 계층구조를 설계할 때 상위 계층 클래스는 일반적인 데이터 멤버와 멤버 함수를 포함하도록 하고, 하위 계층 클래스는 상위 계층의 클래스가 가지고 있는 데이터 멤버와 멤버 함수 외에 그 클래스에 필요한 고유한 데이터 멤버와 멤버 함수를 포함한다. 그리고 동일한 개념의 동작을 정의한 멤버 함수이지만 객체가 속한 클래스에 따라 고유한 동작을 할 수 있어야 하는 경우 오버 라이딩을 통해 가상 함수를 사용한다.
그런데 기초 클래스에서 이러한 가상함수를 만들 때 몸체가 없이 선언만 할 수 있다. 이처럼 몸체가 없는 가상 함수를 순수 가상 함수라 한다.
순사 가상 함수를 선언하는 문장은 다음과 같은 형식으로 작성한다.
virtual ReturnType functionName(fParameterList) = 0;
= 0 이라는 표현은 단순히 이 함수가 순수 가상 함수라는 것을 나타내기 위한 문법적 표현에 불과하다.
어떠한 클래스가 순수가상함수를 포함하고 있다면 그 클래스는 객체를 만들 수 없다. 아직 정의되지 않은 멤버 함수가 있기 때문이다. 이러한 클래스를 추상 클래스라 한다.
이런 추상함수를 기초로 하여 파생 클래스를 선언할 때 기초 클래스에 있는 순수 가상 함수를 그 파생 클래스에 맞춰 동작할 수 있도록 정의해야만 한다. 이러한 순수 가상 함수를 재정의한 파생 클래스는 이제 실체가 있는 대상을 표현하는 클래스로서, 상세 클래스라고 한다. 상세 클래스는 객체를 생성할 수 있다.
가상 기초 클래스
기초 클래스 2개를 상속 받을 수 있다. ,를 통해 다중 상속이 가능한데, 여기서 문제가 하나 있다.
기초 클래스의 상위 클래스가 존재한다고 가정하고 기초 클래스들을 다중 상속받은 하위 클래스의 객체를 생성하면 기초 클래스의 상위 클래스 객체가 2개가 만들어진다. 이러한 불필요한 2개의 객체를 방지하는 것이 가상 기초 클래스이다.
가상 기초 클래스는 기초 클래스에서 상속을 받을 때 가시성 지시어 앞에 virtual 키워드를 통해서 선언할 수 있다.
그러나 이 경우 파생 클래스에서 최상위 클래스의 생성자와 다중 상속받은 기초 클래스들의 생성자를 명시적으로 호출해 주어야 한다. 그렇지 않으면 두 개의 최상위 클래스의 객체가 생성된다.
댓글