여러 글을 쓰는것 보단 소스를 보는게 이해가 훨씬 빠를 듯 하다.
#include <iostream>
// Inher_A 클래스,
// 각각 private, protected, public을 가지고 있다.
class InHer_A
{
int private_int_a;
protected:
int protected_int_a;
public:
int public_int_a;
// 값을 바꾸기 위한 SetData함수
void SetData()
{
// 3개의 변수 모두 내부에서 변경하는것에 대해 문제가 없다.
private_int_a = 1;
protected_int_a = 2;
public_int_a = 3;
}
};
// Inher_A클래스를 public 상속을 한 Inher_B 클래스
class InHer_B : public InHer_A
{
public:
void SetData()
{
// 마찬가지로 값을 변경하기 위한 함수인 SetData()
// protected와 public은 변경이 무리 없지만
// private 변수는 변경 할 수 없다.
// private_int_a = 11;
protected_int_a = 22;
public_int_a = 33;
}
};
// protected 상속을 받은 Inher_C 클래스
class InHer_C : protected InHer_A
{
public:
void SetData()
{
// Inher_B와 마찬가지로 private만 수정할 수 없다.
// private_int_a = 11;
protected_int_a = 22;
public_int_a = 33;
}
};
// private 상속을 받은 Inher_D 클래스
class InHer_D : private InHer_A
{
public:
void SetData()
{
// 마찬가지로 private만 수정할 수 없다.
// private_int_a = 11;
protected_int_a = 22;
public_int_a = 33;
}
};
// 어떤 상속을 받은 클래스던간에 private 멤버 변수는 절대 건드릴 수 없으며,
// public와 protected는 아무런 상관이 없어 보인다.
void main()
{
// 클래스 외부에서의 상황
InHer_A a;
InHer_B b;
InHer_C c;
InHer_D d;
a.SetData();
b.SetData();
c.SetData();
d.SetData();
// a 객체는 안에 존재하는 멤버 변수들이지만
// private와 protected 멤버 변수는 클래스 외부에서 건드릴 수 없다.
//a.private_int_a = 1; 안된다.
//a.protected_int_a = 2; 안된다.
a.public_int_a = 3;
// Inher_A에 public 상속을 받은 b 객체는
// 역시 마찬가지로 a 객체와 같은 반응을 보인다.
//b.private_int_a = 1;
//b.protected_int_a = 2;
b.public_int_a = 3;
// Inher_A에 protected 상속을 받은 c 객체,
// 클래스 외부에서는 Inher_A클래스의 public 멤버 변수조차 사용할 수 없어 진 것을 알 수 있다.
//c.private_int_a = 1;
//c.protected_int_a = 2;
//c.public_int_a = 3;
// Inher_A에 private 상속을 받은 d 객체,
// 마찬가지로 모든 멤버 변수를 사용 할 수 없다.
//d.private_int_a = 1;
//d.protected_int_a = 2;
//d.public_int_a = 3;
}
소스에 대부분의 설명을 넣어 놓았다.
어찌 보면 protected, private와 차이가 없어 보이지만,
상속에 상속을 사용하면 분명 차이가 날것이다.
간단하게나마 도표를 참조 한다.
public 상속을 한 경우 | protected 상속을 한 경우 | private 상속을 한 경우 | |
public 멤버가 | public 멤버로 변한다. | protected 멤버로 변한다. | private 멤버로 변한다. |
protected 멤버가 | protected 멤버로 변한다. | protected 멤버로 변한다. | private 멤버로 변한다. |
private 멤버가 | 접근이 불가능하다. | 접근이 불가능하다. | 접근이 불가능하다. |
결론은 어떤 경우에서는 private 멤버는 그 멤버의 클래스의 내부가 아니면 사용이 불가능.
public 상속은 기존의 클래스의 선언을 그대로 따라 간다는 것.
'프로그래밍 > C++' 카테고리의 다른 글
객체 포인터 (2) | 2010.03.29 |
---|---|
IS-A, HAS-A 관계 (1) | 2010.03.27 |
상속의 객체 생성, 소멸 과정 (0) | 2010.03.26 |
상속의 개념 (0) | 2010.03.24 |
public: private: 그리고 protected: (0) | 2010.03.24 |