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!!
순수 가상 함수를 선언하는 목적은 파생 클래스에게
함수의 인터페이스만을 물려주자는 것이다.
'C++ 심화' 카테고리의 다른 글
| [C++] 인터페이스 상속과 구현 상속의 차이(3) (0) | 2017.02.20 |
|---|---|
| [C++] 인터페이스 상속과 구현 상속의 차이(2) (0) | 2017.02.20 |
| [C++] 객체에 대한 핸들 반환 (0) | 2017.01.06 |
| [C++] 변수의 정의는 최대한 늦추자. (0) | 2017.01.05 |
| [C++] 멤버 함수 보다는 비멤버 비프렌드 함수 (0) | 2017.01.02 |