이전 글에서 정확히 이어지는 내용이다.
: https://nybot-house.tistory.com/58
1. Public, Private
: Public, Private 개념은 익숙하겠지만 다시 한번 정리하면,
1) 외부에서 public 함수 변수에 접근 가능하지만
2) 외부에서 직접적으로 private으로는 접근이 불가능하다.
3) private에 직접 접근하고 싶다면 public 함수를 통해서 접근이 가능하다.
(예시)
Base 클래스에 private int pri,
pubic에 void setPRI(int n) 을 두고
1) private 멤버인 pri에 직접적으로 접근을 할 경우에 접근 불가능.
2) base.setPRI(10) 처럼 public member function으로 접근하면 가능.
2. protected
: 상속에선 private, public 외에 protected가 있다.
이와 같이 protected: int pro;를 base clas의 멤버변수로 만들어 보고,
void setPRO(int n){} 을 만들어 주자.
이 경우에도 위 private과 마찬가지로
직접적으로 protected의 멤버변수에 접근할 경우 오류가 난다.
setPro(100) 이런 식으로, 인터페이스 퍼블릭 멤버함수인 setPRO()로 접근하면 가능하다.
3, 파생 클래스 derived class
여기서 위의 Base 클래스를 상속받는 3가지 방법은 다음과 같은데,
1) class Derived: public Base
2) class Derived: private Base
3) class Derived: protected Base
이 세가지의 차이를 잘 이해해야 한다.
1) public Base 상속의 경우
: 이 때 public은 derived 클래스에서도 똑같이 public 컨텍스트를 갖게 되고,
protected도 똑같이 protected 컨텍스트를 갖게 된다.
하지만 private context는 derived 클래스에서 접근이 불가능하다!
예를 들어서 다음과 같이, derived 클래스에서 public: void test 함수를 만들었을 때
Base클래스의 protected 멤버인 pro에는 접근이 가능하지만 private 멤버인 pri 에는 접근이 불가능하다는 것이다.
*상속받은 클래스에서 Base 클래스의 public, protected에는 접근이 가능하지만 private에는 접근이 불가능하다!
+당연히 setPRO(), setPRIi()의 경우에는 public context를 가지기 때문에 아무런 문제 없이 접근 가능하다.
2)protected Base 상속의 경우
: protected context -> protected 로 그대로지만
public context 의 경우 protected로 변화가 된다. (public -> protected)
파생 클래스가 보기에 Base 클래스의 퍼블릭은 프로텍티드로 보인다는 말이다.
즉, protected로 보이므로 말은 Base클래스의 setPRI(), setPRO()에는 접근이 불가능하다는 의미이다.
3)private Base 상속의 경우
: Base클래스의 public 컨텍스트는 derived클래스에서는 private으로 보이고
protected 멤버도 private으로 보이게 된다.
*Base 클래스의 private 파트에 Derived 파트에서는 어떤 경우에도 전혀 접근이 불가능하단는 것은 명심할 것!
헷갈릴 때는 구글에 C++ private public protected Inheritance를 검색해 볼 것!
정리 잘 된 페이지 참고:
https://stackoverflow.com/questions/860339/what-is-the-difference-between-public-private-and-protected-inheritance-in-c
정리된 설명이 너무 깔끔하다... 내 글이 무의미한 수준.
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x is public
// y is protected
// z is not accessible from B
};
class C : protected A
{
// x is protected
// y is protected
// z is not accessible from C
};
class D : private A // 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};
IMPORTANT NOTE: Classes B, C and D all contain the variables x, y and z. It is just question of access.
'모던C++ > 상속관계 Inheritance' 카테고리의 다른 글
8. Dynamic Cast _C++ (0) | 2022.09.02 |
---|---|
7. Virtual Inheritance 가상 상속_C++ (0) | 2022.09.01 |
6. 다중 상속 multiple inheritance _ C++ (0) | 2022.09.01 |
5. Pure Virtual Function 순수 가상 함수_ C++ (0) | 2022.09.01 |
4. Virtual Table, Virtual Function _ C++ (0) | 2022.08.31 |
3. 가상 함수 Virtual Function _ C++ / Dynamic Polymorphism (0) | 2022.08.23 |
1. Inheritance 상속이란? _ C++ (0) | 2022.08.23 |