일지

Effective C++...32

niamdank 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);

        ...

    }

};


 

※ 클래스의 함수는 필요에 따라 선언의 종류를 나눠서 활용해야 한다.