[C++] class 상속 시 접근 제어자
Base class
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
- 위와 같은 Base class가 있다고 가정하고, 각 케이스를 살펴본다
public inheritance
class B : public A
{
void func_b()
{
x = 10; // x is public
y = 15; // y is protected
// z = 20; // z is private, not accessible
}
};
// ...
int main()
{
B b;
b.x = 10; // x is public
// b.y = 15; y is protected, not accessible
// b.z = 20; z is private, not accessible
return 0;
}
- 일반적으로 가장 많이 사용하는 방식
- Base class의 public 변수에 접근이 가능하다
- Base class의 protected 변수에도 접근이 가능하다
- Base class의 private 변수에는 접근이 불가능하다
protected inheritance
class C : protected A
{
void func_c()
{
x = 10; // x is protected
y = 15; // y is protected
// z = 20; // z is private, not accessible
}
};
// ...
int main()
{
C c;
// c.x = 10; x is protected, not accessible
// c.y = 15; y is protected, not accessible
// c.z = 20; z is private, not accessible
return 0;
}
- public 키워드가 붙어있던 x 변수가 protected가 된다
- y와 z는 기존의 키워드를 유지한다
- 하위 클래스에서의 접근 여부는?
- 유지된다
private inheritance
class D : private A // 'private' is default for classes
{
void func_d()
{
x = 10; // x is private
y = 15; // y is private
// z = 20; // z is private, not accessible
}
};
// ...
int main()
{
D d;
// d.x = 10; x is private, not accessible
// d.y = 15; y is private, not accessible
// d.z = 20; z is private, not accessible
return 0;
}
- 상속 키워드를 명시하지 않는 경우의 default
- public 키워드의 x와 protected 키워드가 붙은 y가 private이 된다
- z는 기존의 키워드를 유지한다
- 하위 클래스에서의 접근 여부는?
- 역시 유지된다
결론
- 외부에서 접근 시 public -> protected -> private 순서로 접근 제어자가 제한된다
- 그러나 내부에서의 접근은 유지된다