본문 바로가기
IT 컴퓨터_프로그램 /c++

오버라이딩_virtual2

by 건축직일상 2015. 10. 13.

정적 - 컴파일에 성격이 결정 된다

동적 - 런타임에 성격이 결정된다 


static - 컴파일 타임에 이미 성격이 결정된다( 정적)


실행중에 성격이 결정되는것은 dynamic 이라고 부른다 


//함수실행 순서

프로그램실행 - 함수호출 - 함수저장주소 참조 - 함수실행 - 함수호출위치로 복귀


이런과정에서 함수저장주소로 연결시켜주는것은 바인딩(binding) 이라고한다


호출하는 위치와 호출될 함수의 주소를 묶는 개념이다


1. 정적 바인딩 (static binding )  - 컴파일 타임에 이미 결정 


이미 컴파일 타임에 호출할 위치와 호출될 함수의 주소가 결정이 되어 바인딩되는것이다

정적 바인딩이 많으면 많을수록 컴파일 타임에 많은 정보가 결정이 된다. 즉 실행속도가 빨라진다

////////////////////////////////


class CObj

{

public:

void Render(void)

{

cout <<"CObj render" << endl;

}

};

void main(void)
{
CObj    obj;
obj.Render();
}


2.동적 바인딩(dynamic binding) 


동적 할당을 해주는 클래스에 의해서 호출하는 함수의 형태를 알게 되는경우에

실행파일을 만들때 바인딩 하지않고 호출할 함수의 주소를 저장할수있는 4바이트 공간을 만들어 

가지고 있다가 런타임중에 바인딩을 결정하고 타입에 대한 검사를 수행하기때문에 속도 저하가 있을수있다

런타임중에 자유로이 성격이 변할수 있기 떄문에 유연한 성격이 가능


class A

{

public: 

virtual void Function(void)

{

cout <<" A Function " << endl;

}

public:

A(void){;}

virtual ~A(void){;}

};

class B :public A

{

public:

void Function(void)

{

cout <<" B Function " << endl;

}

public:

B(void){;}

~B(void){;}


};

void    main(void)

{

A*    pA = new B;

pA->Function(); // Bfunc

pA->A::Function(); // Afunc

}

virtual 이 없는 형태에서는 pA 둘다 A Function 이 출력 되지만 virtual 을 넣어주면

원래공간의 Bfunction Afunction 이 출력이 된다 


4바이트 공간에 있다가 함수를 쓰면 실행중에 바인딩 시키는 것이 동적 바인딩이다

virtual 키워드가 동적 바인딩을 해줄수 있도록 만드는 키워드 였다


////////////////////////////////////////////////////////////////////////////


virtual 이 붙는 함수를 가상함수 라고 부른다

virtual 을 붙이고 함수를 선언만하고 구현하지 않은것  - 순수 가상함수

순수 가상함수를 하나라고 가지고 있는 클래스 - 추상 클래스

추상 클래스는 인스턴스화 할수없다

추상클래스를 상속받은 자식클래스 역시 추상클래스가 된다

자식 클래스 객체를 만들려면 반드시 순수 가상함수를 오버라이딩 해서 사용해야 한다 


///////////////////////////////////////////////////////////////////////////


class CParent

{

public:

//순수 가상함수 

virtual void Render(void) = 0;

CParent(void)

{

cout << "CParent생성자"  << endl;

}

};

//////////////

class CChild :public CParent 

{

public:

virtual void Render(void)

{ //가상함수 구현해야 한다 

cout << "CChild render" << endl;

}

};

class CChild2 :public CParent 

{

public:

virtual void Render(void)

{ //가상함수 구현해야 한다 

cout << "CChild2 render" << endl;

}


};

void main(void)

{

CParent*    pParent = new CParent; // parent 클래스는 함수구현이 안되어 있기때문에 추상클래스 이다

//추상클래스는 인스턴화 할수없다 // 에러

CChild*    pChild = new CChild; // 자식 클래스에서 순수가상함수를 오버라이딩해서 사용

}


///////////////////


CParent* pArray[2];

pArray[0] = new CChild;

pArray[1] = new CChild2;


for(int i = 0; i < 2 ; ++ i)

{

pArray[i]->Render();

}

//이런식으로도 사용이 가능하다 


'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글

템플릿  (0) 2015.10.18
연산자 오버로딩  (0) 2015.10.18
오버라이딩_virtual  (0) 2015.10.13
캐스팅연산  (0) 2015.10.12
클래스_상속  (0) 2015.10.12

댓글