[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!!

비가상 함수는 인터페이스 상속과 더불어 필수 구현의 상속을 뜻한다.

+ Recent posts