ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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);

            ...

        }

    };


     

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

     

    댓글

Designed by Tistory.