꿈소년의 개발 이야기

C++ 세 가지 형태의 상속 본문

Software Engineering

C++ 세 가지 형태의 상속

꿈소년 2008. 6. 9. 22:52
반응형

C++ :: 세 가지 형태의 상속

세 가지의 형태의 상속이란 public상속, protected상속, private상속을 가리키는 말이다.
base클래스의 멤버는 derived클래스로 상속되는 과정에서 접근권한이 변경된다.  public상속, protected상속, private상속의 차이점은 바로 거기에 있다. 즉 base클래스의 멤버를 derived클래스로 상속하는 과정에서 접근권한이 변경되는데, 어떻게 변경되는냐에 따라서 public상속, protected상속, private상속으로 나뉘는 것이다.

다음은 상속되는 과정에서 접근권한이 어떻게 변경되는지를 보여주는 표이다.

상속의 유형에 따른 접근 권한의 변경
  public 상속 protected 상속 private 상속
public 멤버 public protected private
protected 멤버 protected protected private
private 멤버 접근 불가 접근 불가 접근 불가

상속의 형태에 따라서 어떻게 접근권한이 변경되는지를 살펴보도록 한다. 다음 예제는 public상속이다.

class base {
private:
    int a;
protected:
    int b;
public:
    int c;
};

class derived : public base { };

int main(void) {
    derived object;

    return 0;
}

private멤버 a는 상속되는 과정에서 어떻게 되겠는가? private멤버는 볼 것도 없다. private멤버는 무조건 클래스 외부에서 접근이 안되므로 private도, protected도 아닌 접근불가이다.
protected멤버 b는 표를 보면, 멤버가 protected멤버이고, public상속이므로 protected가 됨을 알 수 있다. public멤버 c는 public이 됨을 알 수 있다.

접근불가라는 접근권한이 상당히 생소하게 느껴진다. private와 접근불가는 엄연히 다른 의미를 지닌다. private라면 object객체 내에서 직접 접근이 가능했을 것이다. 그러나 접근불가이기 때문에 object객체 내에서도 직접 접근이 불가능하다. 물론 base클래스의 public, 혹은 protected멤버 함수를 통해서 간접적인 형태로 접근하는 것이 가능하다.

표를 통해서 protected상속, private상속의 경우 멤버의 접근권한이 어떻게 변경되는지 확인할 수 있다. protected상속의 경우,

class derived : protected base

private멤버는 접근불가, protected멤버는 protected, public멤버는 protected.

private상속의 경우,

class derived : private base

private멤버는 접근불가, protected멤버는 private, public멤버는 private.

따라서 다음과 같은 규칙을 이해하면 된다.

"public상속은 public보다 접근권한이 넓은 것을 public으로 맞춰준다."
"protected상속은 protected보다 접근권한이 넓은 것을 protected로 맞춰 준다."
"private상속은 private보다 접근권한이 넓은 것을 private로 맞춰 준다."

예를 들어, protected상속을 하고자 한다. public멤버는 접근권한이 protected보다 넓으므로 protected가 된다. private상속을 하려하면 protected멤버는 private보다 접근권한이 넓으므로 private가 된다. protected상속을 하려하면 private멤버는 protected보다 접근권한이 좁으므로 그냥 private가 된다? 이 점은 주의해야 한다. private멤버는 무조건 접근불가이다.