C++의 인터페이스 상속과 구현 상속(1)

인터페이스만을 물려주자 : 순수 가상 함수




클래스 설계자 입장에서 보면, 

1. 멤버 함수의 인터페이스 만을 상속받고 싶은 경우

2. 함수의 인터페이스 및 구현을 모두 상속받고 그 상속받은

 구현이 오버라이드가 가능하게 만들었으면 할 경우

3. 또한 인터페이스와 구현을 상속받되 어떤 것도

 오버라이드할 수 없도록 막고 싶은 경우가 있다.


오늘은 인터페이스만을 상속받고 싶은 경우에 대해서 알아보자.




class Shape{

public:

virtual void draw const = 0;                ----- 1번

virtual void error (const string& msg);----- 2번

int objectId() const;                            ----- 3번


}



1번은 순수 가상함수로 선언되어 있다. 그말인 즉슨

Shape는 추상 클래스가 되고 인스턴스를 만들 수 없다.


순수 가상 함수의 가장 두드러진 특징이라면

1. 어떤 순수 가상 함수를 물려받은 구체 클래스가 해당

순수 가상 함수를 다시 선언해야 한다.

2. 순수 가상 함수는 전형적으로 추상 클래스 안에서

정의를 갖지 않는다.




따라서 순수 가상 함수를 선언하는 목적은

파생 클래스에서 함수의 인터페이스만을 물려주는 것이다.




하지만 순수 가상 함수에도 정의를 제공할 수 있다.

구현을 제공할 수 있다는 말이다. 단, 구현이 붙은

순수 가상 함수를 호출하려면 반드시 클래스의

이름을 한정자로 붙여 주어야만 한다.


Shape *ps = new Rec;

ps -> Shape::draw();




이는 단순 가상 함수에 대한 기본 구현을

안전하게 제공하는 메커니즘으로 활용할 수 있다.

이 부분에 대해서는 인터페이스와 기본 구현도

함께 물려받는 경우, 즉 단순 가상 함수에 대해

포스팅을 할 때, 같이 진행하도록 하겠다.




Point!!

순수 가상 함수를 선언하는 목적은 파생 클래스에게

함수의 인터페이스만을 물려주자는 것이다.


+ Recent posts