[C++] 인터페이스 상속과 구현 상속(3)
인터페이스와 더불어 그 함수의
필수적인 구현을 물려받게 하는 비가상 함수
![]()
1. 멤버 함수의 인터페이스 만을 상속받고 싶은 경우
2. 함수의 인터페이스 및 구현을 모두 상속받고 그 상속받은
구현이 오버라이드가 가능하게 만들었으면 할 경우
3. 또한 인터페이스와 구현을 상속받되 어떤 것도
오버라이드할 수 없도록 막고 싶은 경우
![]()
class Shape{
public:
virtual void draw const = 0; ----- 1번
virtual void error (const string& msg);----- 2번
int objectId() const; ----- 3번
}
인터페이스와 그 함수의 필수적인 구현을 물려받게 하는 것
즉, 위의 예시에서 3번에 해당하는 경우가 되겠다.
![]()
int objectId() const; ----- 3번
객체의 식별자를 내어주는 함수인데
객체 식별자를 계산하는 방법은 항상 똑같다는
전재하에 선언된 함수라 할 수 있다.
실제 계산 방법은 Shape::objectID의 정의에서
결정되고, 파생 클래스에서는 이를 바꿀 수 없다.
![]()
매우 간단하기 때문에 더 이상 설명이 필요없지만,
인터페이스 상속과 구현 상속을 하는데 있어
자주 일어나는 실수에 대해 알아보도록 하자.
![]()
1. 모든 멤버 함수를 비가상 함수로 선언하지 말자.
이러한 경우 파생 클래스를 만들어도 자신만의 특별한
동작을 만들 여지가 없어진다. 기본 클래스로 사용할
용도로 디자인 한 것이라면 대부분 가상 함수를 갖고 있게 된다.
![]()
2. 모든 멤버 함수를 가상 함수로 선언하지 말자.
이러한 부분이 맞는 경우도 있겠지만, 분명히 파생 클래스에서
재정의가 안 되어야 하는 함수도 분명히 있을 것이다.
이러한 경우는 비가상 함수로 만들어 입장을 확실히 하자.
![]()
POINT!!
비가상 함수는 인터페이스 상속과 더불어 필수 구현의 상속을 뜻한다.
'C++ 심화' 카테고리의 다른 글
| [C++] 상속받은 비가상 함수의 재정의 (0) | 2017.02.21 |
|---|---|
| [C++] 오버로딩 된 함수의 상속, using 선언 (0) | 2017.02.21 |
| [C++] 인터페이스 상속과 구현 상속의 차이(2) (0) | 2017.02.20 |
| [C++] 인터페이스 상속과 구현 상속의 차이(1) (0) | 2017.02.20 |
| [C++] 객체에 대한 핸들 반환 (0) | 2017.01.06 |