광역 변수를 사용할 때는 꼭 초기화를 해 주어야 한다. 초기화 해주는 부분은 main.cpp 에서 하는 것과 같이 해 주면 된다.

 // head.h

extern int a;

extern int b;


// main.cpp

#include "head.h"


int a = 10;

int b = 20;


void main()

{

a = 1;

b = 2;

}


// sub.cpp

#include "head.h"


void sub()

{

a = 2;

b = 3;

}

'Programming > 이것저것' 카테고리의 다른 글

TCP/IP PPT 에서 뜯어왔음ㅋ  (0) 2010.03.18
OSI 7Layer  (0) 2010.03.18
Virtual Function  (0) 2010.03.18
Virtual Destructor  (0) 2010.03.18
try/catch와 if/else의 차이점  (0) 2010.03.18

상속에서 중요한 것 중 하나는 부모가 자식을 가리킬 수 있다는 것이다.

다음 소스를 보자.

Snap4.png

내 기대는 p->fucntion(); 문장이 "Derived"를  호출하는 것이었지만 결과는 "Base"를 호출한다.

왜 그럴까?


위 이유는 포인터의 형이 정해진 시점에서 이미 호출되어질 함수가 정해지기 때문이다.

포인터 p함수는 Base로 형이 선언되어 있기 때문에 자신의 함수 밖에 호출할 수 가 없다.

즉, 포인터가 무엇을 가리키든지 간에 Base로 형이 선언되어 있어서 호출 할 수 있는 함수도 정해져 있다는 것이다.


위의 결과를 제대로 보이게 해주는 것이 virtual 키워드 이다.

함수의 리턴타입 앞에 virtual이라는 키워드를 붙여주면 가상함수가 된다.


부모 클래스에만 virtual을 붙여주면 되지만, 보통은 자식 클래스에도 붙여서 명시한다.

virtual 키워드를 붙여주면 우리가 원하는데로 값이 출력되는 것을 볼 수 있다.

가상함수는 정적 결합(많이 들어본 용어일 것이다. 정확히는 링킹시에 결합이다.)을 하지 않고 동적 결합(실행 중에 결정된다.)을 사용한다.


Snap5.png


문장을 위와 같이 고치면 원하는 결과가 출력되는 것을 볼 수 있다.


'Programming > 이것저것' 카테고리의 다른 글

OSI 7Layer  (0) 2010.03.18
광역 변수  (0) 2010.03.18
Virtual Destructor  (0) 2010.03.18
try/catch와 if/else의 차이점  (0) 2010.03.18
C++ Style Type Casting  (0) 2010.03.18

왜 가상 파괴자가 필요한지 예를 통해서 보도록 하자.

아래는 우리가 일반적으로 사용하는 상속의 사용 예이다.

Snap1.png


우리는 Derived 클래스가 Base를 상속받게 하고 Base 클래스를 포인터로 선언해

Derived를 생성해주고 있다.

우리는 생성과 파괴가 아래처럼 되기를 원할 것이다.

Snap2.png


하지만 결과는 아래와 같이 나온다.

Snap3.png

왜 그럴까..??


위 이유는 포인터의 형이 정해진 시점에서 이미 호출되어질 함수가 정해지기 때문이다.

포인터 p함수는 Base로 형이 선언되어 있기 때문에 자신의 함수 밖에 호출할 수 가 없다.

즉, 포인터가 무엇을 가리키든지 간에 Base로 형이 선언되어 있어서 호출 할 수 있는 함수도 정해져 있다는 것이다.


생성자의 경우는 소스에서 보듯이 new Derived를 했기 때문에 우리가 명시적으로 호출을 해주고 있지만.

파괴자의 경우는 Base의 파괴자만 호출이 되는 것이 맞다. 왜냐면 p함수는 Base 형이기 때문에.


그렇기 때문에 아래와 같은 소스로 바꿔야 한다.

Snap4.png

위 소스와 같이 Base의 파괴자를 가상함수로 선언하게 되면 p의 파괴자가 동적바인딩이 되게 된다.

virtual 함수는 정적인 함수 호출을 동적 호출로 바꿀 수 있게 해주는 것이다.

위으 Base는 가상함수가 되며 동적 바인딩이 가능해진다. 동적바인딩이 되어 Base 형의 파괴자가

실행되는 것이 아니라 Derived의 파괴자가 실행되며 그 후 Base의 파괴자가 실행되어 완전한 메모리

해제가 이루어 진다.


'Programming > 이것저것' 카테고리의 다른 글

광역 변수  (0) 2010.03.18
Virtual Function  (0) 2010.03.18
try/catch와 if/else의 차이점  (0) 2010.03.18
C++ Style Type Casting  (0) 2010.03.18
#pragma pack  (0) 2010.03.18

+ Recent posts