본문 바로가기
프로그래밍/C++

상속의 형태

by 리뷰하는 (게임)프로그래머_리프TV 2010. 3. 26.



여러 글을 쓰는것 보단 소스를 보는게 이해가 훨씬 빠를 듯 하다.


#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