C++ 상속과 접근 지정자

2021. 3. 20. 17:24·SW개발/C++
반응형

상속과 접근 지정자

  • 상속 적용 시 부모 클래스 앞에 public, protected, private와 같은 접근 지정자를 붙인다.

    • 자식 클래스에서 기본적으로 부모 클래스의 멤버들을 어떤 권한으로 받아들일지에 관한 것이다.

예제

  • 아래 예제의 경우 public으로 상속받았으므로 멤버들의 기본 접근 권한이 public이 된다.

    • protected, private은 public보다 보안이 더 강하므로 그대로 적용된다.
    #include <iostream>
    
    class Base
    {
    public:
      int    public_;
    protected:
      int    protected_;
    private:
      int private_;
    };
    
    class Derived : public Base
    {
    };
    
    int        main()
    {
      using namespace std;
    
      Derived d;
    
      d.public_ = 1024;
    }
  • public 대신 protected를 사용하는 예제

    • public 멤버가 Derived 클래스에서는 protected로 적용된다.

      • Derived 클래스 내부에서는 public_, protected_ 모두 접근할 수 있다.
    #include <iostream>
    
    class Base
    {
    public:
      int    public_;
    protected:
      int    protected_;
    private:
      int    private_;
    };
    
    class Derived : protected Base
    {
    };
    
    int        main()
    {
      using namespace std;
    
      Derived d;
    
      d.public_ = 1024;  // 에러
    }
    • 다음과 같이 접근 오류가 발생한다.

      error C2247: 'Base::public_' not accessible because 'Derived' uses 'protected' to inherit from 'Base'
    • Base 클래스의 멤버가 Derived 클래스 안으로 다음과 같이 들어온 것처럼 생각하면 된다.

      class Derived : protected Base
      {
      protected:
        int    Base::public_;
        int    Base::protected_;
      };

2번 상속하는 경우

  • Base -> Derived -> GrandChild로 상속이 적용되는 예제

    • Derived 클래스가 Base 클래스를 protected로 받은 경우

      • GrandChild 클래스에서 Base 클래스의 protected 멤버까지 접근할 수 있다.
      #include <iostream>
      
      class Base
      {
      public:
        int    public_;
      protected:
        int    protected_;
      private:
        int private_;
      };
      
      class Derived : protected Base
      {
      public:
        Derived()
        {
          Base::public_;
          Base::protected_;
        }
      };
      
      class GrandChild : public Derived
      {
      public:
        GrandChild()
        {
          Derived::Base::public_;
          Derived::Base::protected_;
        }
      };
      
      int        main()
      {
        using namespace std;
      
        Derived d;
      }
    • Derived 클래스가 Base 클래스를 private로 받은 경우

      #include <iostream>
      
      class Base
      {
      public:
        int    public_;
      protected:
        int    protected_;
      private:
        int private_;
      };
      
      class Derived : private Base
      {
      public:
        Derived()
        {
          Base::public_;
          Base::protected_;
        }
      };
      
      class GrandChild : public Derived
      {
      public:
        GrandChild()
        {
          Derived::Base::public_;    // 에러
          Derived::Base::protected_; // 에러
        }
      };
      
      int        main()
      {
        using namespace std;
      
        Derived d;
      }
      • Derived 클래스에서는 Base 클래스의 멤버가 private 상태이기 때문에 접근할 수 있다.

      • 하지만 GrandChild 클래스에서는 Derived 클래스의 private 멤버에 접근할 수 없으므로 다음과 같은 에러가 발생한다.

        error C2247: 'Base::public_' not accessible because 'Derived' uses 'private' to inherit from 'Base'
반응형
저작자표시 (새창열림)

'SW개발 > C++' 카테고리의 다른 글

C++ 상속받은 멤버의 접근 권한 변경  (0) 2021.03.20
C++ 함수 오버라이딩  (0) 2021.03.20
C++ 상속과 패딩  (0) 2021.03.20
C++ 유도된 클래스들의 소멸 순서  (0) 2021.03.19
C++ 유도된 클래스들의 생성 순서  (0) 2021.03.19
'SW개발/C++' 카테고리의 다른 글
  • C++ 상속받은 멤버의 접근 권한 변경
  • C++ 함수 오버라이딩
  • C++ 상속과 패딩
  • C++ 유도된 클래스들의 소멸 순서
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (318)
      • SW개발 (268)
        • Java Spring (6)
        • C++ (186)
        • Python (21)
        • Linux (16)
        • 알고리즘 (13)
        • Git (4)
        • Embedded (1)
        • Raspberrypi (9)
        • React (3)
        • Web (2)
        • Windows Device Driver (6)
      • IT(개발아님) (45)
        • Windows (25)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dism
    로지텍 마우스 제스처
    MacOS
    제외
    spring
    Solaris 10
    맥북 카카오톡 알림 안뜸
    스프링 프레임워크 핵심 기술
    SFC
    mspaint
    그림판
    KakaoTalk
    vscode
    java
    EXCLUDE
    citrix workspace
    logi options
    알림
    윈도우 명령어
    unix
    윈도우
    Workspace
    windows
    스프링
    Windows 11
    SunOS 5.1
    백기선
    시스템 복구
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
C++ 상속과 접근 지정자
상단으로

티스토리툴바