갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 2020년 게임 매출
  • pc게임 순위
  • 유니티 골드그래프
  • 전세계게임매출순위
  • pc 게임 순위
  • c# delegate
  • 게임매출순위
  • 게임 매출 순위
  • 강남 방탈출
  • 롤 골드그래프
  • C++ virtual
  • c# coroutine
  • 게임 디자인 패턴
  • Unity Graph
  • c# unboxing
  • c# Thread
  • 알고리즘
  • C# boxing
  • 글로벌게임매출
  • C++ 소멸자
  • 전세계 게임 매출
  • C# 예외 처리
  • 유니티 그래프
  • c# collection
  • 모바일 게임 순위
  • c# 코루틴
  • 유니티 그래프 그리기
  • 자바
  • C++
  • C++ 상속

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 상속과 접근 지정자 (access specifiers)
프로그래밍/C++

[C++] 상속과 접근 지정자 (access specifiers)

2019. 11. 25. 00:52
728x90
반응형

1. 상속과 접근 지정자 (access specifiers)

class Base {
private:
    int a;
public:
    int c;
};

class Derived : public Base {
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.c = 10; // ok
}

 

위 코드는 Base를 기반 클래스로 Derived클래스가 상속받았다.
따라서 Derived클래스에는 적혀있진 않지만 a와 c 멤버데이터가 있다.
main함수에서 a와 c에 접근하려 하는데 c는 public이라 상관없지만
a는 private으로 외부에서 접근할 수 없으므로 에러가 난다.
그렇다면 다음 코드는 어떨까?

 

class Base {
private:
    int a;
public:
    int c;
};

class Derived : public Base {
public:
    void tmp() {
        a = 10; // error
        c = 10; // ok
    }
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.c = 10; // ok
}

 

이번엔 Derived클래스 내부에 tmp함수를 만들었다.
tmp함수는 a와 c에 접근하는데 Derived클래스는 Base클래스를 상속받은 상태이다. 이 경우는 어떨까?
결론은 a에 접근할 때 에러가 난다. 
private은 상속받은 클래스라도 외부에서 접근을 못하게 한다.
그래서 등장한 것이 protected이다.

 

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

class Derived : public Base {
public:
    void tmp() {
        a = 10; // error
        b = 10; // ok
        c = 10; // ok
    }
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.b = 10; // error
    derv.c = 10; // ok
}

 

 


2. private VS protected

#include <iosteram>
#include <string>

class Person {
    std::string name;
    int age;
};

class Student : public Person {
    int id;
public:
    void print() const {
        std::cout << name << std::endl;
        std::cout << age  << std::endl;
        std::cout << id   << std::endl;
    }
};

int main() {
}

 

위 코드에서 name과 age는 private이기 때문에 
Student클래스에서 print함수에서 에러가 난다.
해결 방법으로는 2가지가 있다.

 

public:
    int getAge() const { return age; }

 

1. Person 클래스 내부에 멤버 데이터의 값을 리턴해주는 함수를 제공

  ① private

    => 파생 클래스에서도 접근할 수 없다.

    => 값을 변경하거나 얻으려면 기반 클래스의 멤버함수를 사용해야 한다.

 

class Person {
protected:
    std::string name;
    int age;
};

 

2. 멤버데이터를 protected로 제공

  ② protected

    => 외부에서는 접근할 수 없지만 파생 클래스에서는 직접 접근할 수 있다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] upcasting  (0) 2019.11.26
[C++] 상속에서의 생성자 소멸자  (0) 2019.11.26
[C++] 상속  (0) 2019.11.24
[C++] this 포인터  (0) 2019.11.24
[C++] const member function  (0) 2019.11.17
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] upcasting
    • [C++] 상속에서의 생성자 소멸자
    • [C++] 상속
    • [C++] this 포인터
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바