출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/5


이번은 클래스의 상속에 대해서 설명합니다. 클래스의 상속은 클래스의 기능(변수나 함수)를 이어 받아 새로운 클래스를 만드는 것입니다. 상속 클래스의 것을 기초 클래스, 혹은 기본 클래스라고 하며, 상속된 클래스를 파생 클래스라고 합니다. 파생 클래스는 기본 클래스의 public, protected의 한정자가 지정된 변수와 함수를 이어 사용할 수 있습니다. pravte 한정자가 지정되어 있던 것은 그 클래스 내에서 밖에 액세스 할 수 없으므로, 파생 클래스에서 사용하는 것은 불가능합니다.

일단 코드를 먼저 봅시다.



//기본 클래스 TEST
class TEST{
private:
	int pv;
protected:
	int figure;
	TEST(){
		figure=10;
		pv=5;
	}
};

//파생 클래스 SUPER
class SUPER : public TEST{
private:
	int superfigure;
public:
	//생성자로 기본 클래스의 figure 변수를 superfigure에 할당한 후, 렌더링
	SUPER(void){
		superfigure=figure;
		printf("%d\n",superfigure);
	}
};

int main(void)
{
	//파생 클래스 SUPER 포인터를 선언
	SUPER *test;

	//new를 사용하여 동적 확보
	test=new SUPER;

	delete test;

	return 0;
}



위 예제는 "10"이 표시가 됩니다. 먼저 키본 클래스 TEST를 정의하고 있습니다. 이건 괜찮네요. 보셔야 할 것은 그 아래의 SUPER라는 클래스가 TEST 클래스를 상속한 파생 클래스입니다.

최종적인 작성 방법은


class 파생_클래스_명 :상속_한정자 기본_클래스_이름{


};


입니다. 여기에 쓰기 상속 한정자는 다음과 같은 의미가 있습니다.


  • public - 기본 클래스에서 설정한 액세스 한정자 설정을 그대로 이음.
  • protected - 기본 클래스에서 public이였던 것을 protected로 인계함. 다른 것들은 그대로.
  • private - 기본 클래스의 모든 멤버를 private로 인계.

public의 경우는 그대로 계승하므로 설명은 필요없다고 생각합니다만, protected나 private의 경우는 이해하실 수 있으려나요? 예를 들어, 상속 한정자를 pretected로 한정하는 경우 기본 클래스에서 public인 멤버가 파생 클래스에서는 protected로 취급 되기 때문에, 외부에서는 액세스할 수 없습니다.
마찬가지로 상속 한정자가 private인 경우, 당연히 외부에서 액세스 할 수 없게 되고, 클래스를 다시 상속하더라고 그 앞의 파생 클래스에서 액세스 할 수 없게 됩니다.
뭐, 앞으로 프로그래밍을 하는 데에 있어서 상속 한정자는 대부분 public을 사용할 것이라고 생각하니 그렇게 신경쓰지 않으셔도 될 겁니다. ^^

파생 클래스에서 사용할 변수와 함수는 기본 클래스의 액세스 한정자 proected 또는 public으로 정의한 것 뿐입니다. private로 설정하는 것은 파생 클래스에서 액세스(실행) 할 수 없기 때문에 주의해주세요. 덧붙여서 반대로는 할 수 없습니다.

즉, 기본 클래스에서 파생 클래스의 변수와 함수를 액세스 하는 것은 어떤 액세스 한정자도 불가능이라는 겁니다. 이제 상속 작성, 구조는 이해할 수 있나요?


그렇다면 코드의 자세한 설명으로 들어가겠습니다. 먼저 main 함수 super 클래스를 동적 확보합니다. 동적 확보 했을 때는 무엇이 실행되는지 기억하고 있나요? 네, 생성자입니다. 하지만 이번에는 상속된 클래스를 동적 확보하고 있습니다. 두 생성자가 실행되는 걸까요? 정답은 기본 클래스의 생성자가 실행된 후, 파생 클래스이 생성자가 실행되는 것입니다.

그래서 이번 처리의 흐름은 이렇게 되어있습니다.


[1] new로 SUPER 클래스를 동적 확보

[2] 기본 클래스 TEST의 생성자가 실행 (figure = 10, pv = 5로 설정된다.)

[3] 파생 클래스 super 생성자가 실행된다 (기본 클래스 figure 변수를 대입하며 printf로 표시)


이런 흐름에서 10이라는 숫자가 표시되어지는군요. 이해할 수 있으셨나요? 덧붙여서, 동적 확보한다는 것은 외부에서 액세스 할 수 있다는 것이므로, 기본 클래스와 파생 클래스 생성자의 액세스 한정자는 public이여야 합니다.


그럼 추가로 소멸자의 경우는, 생성와 역순으로 실행됩니다. 즉, 파생 클래스 → 기본 클래스의 순서대로 실행됩니다.


또한 이번에는 파생 클래스의 인스턴스를 생성 (동적 확보) 한 떄에는, SUPER 클래스의 포인터에서 포인터로 받았지만, SUPER 클래스는 TEST 클래스를 상속하고 있기 때문에, TEST 클래스의 포인터로 해당 동적 확보를 한 포인터를 받을 수 있습니다.

그러니까,


TEST *test;

test = new SUPER;


로 작성하는 것도 가능하다는 것이죠. 이후 동일하게 실행됩니다. 하나 쯤 다른 것이라면 기본 클래스와 파생 클래스에서 동일한 함수 이름을 정의하고 실행한 경우입니다. 이 경우는 받는 포인터의 클래스에 따라 실행됩니다.

즉,

TEST *test;

test = new SUPER;

라고 한 경우, TEST 클래스(기본 클래스) 측의 함수가 실행됩니다. SUPER *test라고 하면 파생 클래스 측의 함수가 실행됩니다. 동일한 함수 이름을 정의할 때 이러한 차이에 유의하시길 바랍니다. 그 밖에는 무슨 의미가 있지? 라고 의아해 하는 분도 있을지 모르겠습니다만, 이것은 나중에 공부할 가상 함수라고 합니다. 꼭 기억해두세요.


이번 시간은 여기까지 입니다. 다음 시간은 가상 함수에 대해 설명합니다.

'공부 > C/C++' 카테고리의 다른 글

(C++) STL에 대해서  (0) 2014.03.27
(C++) string 형식  (0) 2014.03.27
(C++) C++의 문자열 출력에 대해서  (0) 2014.03.26
(C++) 가상 함수  (0) 2014.03.26
(C++) 클래스의 생성자와 소멸자  (0) 2014.03.26