-
Effective C++...32일지 2022. 8. 3. 08:37
인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자
함수의 종류
C++에는 다음과 같이 함수를 구분해 사용할 수 있다.
- 순수 가상 함수 함수를 선언만 하고 구현을 하지 않음으로 파생 클래스에 구현 의무를 넘겨주는 인터페이스 역할을 한다.
- 단순 가상 함수 함수의 기본적인 구현을 하여 파생 클래스에서 필요한 경우에만 함수의 구현을 수정할 수 있도록 한다.
- 비 가상 함수 파생 클래스에서 구현을 변경할 여지를 주지 않는 일반적인 구현 방식이다.
단순 가상 함수의 문제점
단순 가상 함수는 기본적인 구현이 존재하기 때문에 파생 클래스를 구현할 때 구현이 필요하다는 것을 잊을 수 있다.
따라서 순수 가상 함수를 함께 활용하여 구현 의무를 전달할 수 있다.
class Airplane {
public:
// 순수 가상 함수로 구현 의무를 전달한다.
virtual void fly(const Airport& destination) = 0;
...
protected:
// 기본 구현을 다른 함수에 구현한다.
void defaultFly(const Airpoort& destination) { ... }
};
class ModelA: public Airplane {
public:
// 순수 가상 함수를 구현하면서 기본 구현을 사용한다.
virtual void fly(const Airport& destination)
{
defaultFly(destination);
...
}
};
이러한 구현이 함수가 나뉘기 때문에 문제라고 보는 시각이 존재하며 다음과 같이 구현하기도 한다.
class Airplane {
public:
virtual void fly(const Airport& destination) = 0;
...
};
// 기본 클래스에서 순수 가상 함수의 구현을 마련한다.
void Airplane:fly(const Airport& destination) { ... }
class ModelA: public Airplane {
public:
virtual void fly(const Airport& destination)
{
// 다른 함수를 사용하는 대신 기본 클래스의 구현을 사용한다.
Airplane::fly(destination);
...
}
};
※ 클래스의 함수는 필요에 따라 선언의 종류를 나눠서 활용해야 한다.