본문 바로가기
■ 프로그래밍, 개발

Override 와 Virtual 의 차이와 의미

by 토크맨 2014. 3. 9.
반응형

 

< Override 와 Virtual 의 차이와 의미 > 

 

Override 함수와 Virtual 함수의 차이는 아주 중요합니다. 

Override 함수는 부모클래스의 함수를 재선언 및 재정의 하는 것을 의미하는데요 

이때 자식클래스를 통하여 Override 된 함수를 호출할 경우 부모클래스의 함수는 무시되어집니다.

또한 부모클래스 변수를 통하여 자식클래스의 Override 된 함수를 호출하려면 형변환을 거쳐서만  

실행할 수 있다. 

Virtual 키워드는 부모클래스의 포인트 변수 하나만으로 자식클래스의 함수를 형변환 없이 호출 할 수 있는 

방법을 제시합니다.

 

 

* 샘플소스 *

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

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

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

//

#include "stdafx.h"

#include "stdlib.h"

 

class CParent

{

public:

CParent() { printf("CParent()\r\n"); }

virtual ~CParent() { printf("~CParent()\r\n"); }

 

void NomalFunc() { printf("[NomalFunc] -> CParent \r\n"); }

virtual void VirtualFunc() { printf("[VirtualFunc] -> CParent\r\n"); }

};

 

class CChildAAA : public CParent

{

public:

CChildAAA() { printf("CChildAAA()\r\n"); }

virtual ~CChildAAA() { printf("~CChildAAA()\r\n"); }

 

void NomalFunc() { printf("[NomalFunc] -> CChildAAA \r\n"); }

virtual void VirtualFunc() { printf("[VirtualFunc] -> CChildAAA \r\n"); }

};

 

class CChildBBB : public CParent

{

public:

CChildBBB() { printf("CChildBBB()\r\n"); }

virtual ~CChildBBB() { printf("~CChildBBB()\r\n"); }

 

void NomalFunc() { printf("[NomalFunc] -> CChildBBB \r\n"); }

virtual void VirtualFunc() { printf("[VirtualFunc] -> CChildBBB \r\n"); }

};

 

int _tmain(int argc, _TCHAR* argv[])

{

printf("=============================================== \r\n"); 

printf("============ new CParent \r\n");

      CParent* pParent1 = new CParent;

printf("=============================================== \r\n"); 

printf("============ new CChildAAA \r\n");

CParent* pParent2 = new CChildAAA;

printf("=============================================== \r\n"); 

printf("============ new CChildBBB \r\n");

CParent* pParent3 = new CChildBBB;

printf("=============================================== \r\n\r\n\r\n"); 

 

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

// Call Override Func.

pParent1->NomalFunc();

     pParent2->NomalFunc();

     pParent3->NomalFunc();

 

printf("\r\n");

 

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

// Call Virtual Func.

pParent1->VirtualFunc();

     pParent2->VirtualFunc();

     pParent3->VirtualFunc();

 

printf("\r\n\r\n\r\n=============================================== \r\n"); 

printf("============ delete pParent1 \r\n");

      delete pParent1;

printf("=============================================== \r\n"); 

printf("============ delete pParent2 \r\n");

delete pParent2;

printf("=============================================== \r\n"); 

printf("============ delete pParent3 \r\n");

      delete pParent3;

printf("=============================================== \r\n\r\n\r\n"); 

 

system("pause");

return 0;

}

//

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

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

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

 

< 결과 화면 >

 

 

 

 

* 여기서 가상소멸자 함수를 한번 주목해주세요 

   부모클래스의 소멸자 함수에 virtual 이 있을 때와 없을 때의 차이를 한번 확인해 보시면 

   왜 부모클래스의 소멸자 함수에 virtual 을 사용하는 지를 아실 수 있을 것입니다.

   부모클래스의 소멸자 함수에 virtual 이 빠지면 소멸시 자식클래스의 소멸자는 호출되지 않습니다. 

   따라서 부모클래스의 포인터변수를 delete 할 때 자식클래스의 소멸자 함수까지 호출될 수 있도록 하기 

   위하여 virtual 키워드를 사용합니다.    대부분 메모리 정리를 하기 위해서 일꺼라 생각됩니다.

 

 

 

 

반응형

댓글