< 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 키워드를 사용합니다. 대부분 메모리 정리를 하기 위해서 일꺼라 생각됩니다.
'■ 프로그래밍, 개발' 카테고리의 다른 글
자바의 특징, 요약, 정리 (0) | 2016.07.27 |
---|---|
해상도 크기 비교 (0) | 2016.07.18 |
쓰레드 동기화기법 - CriticalSection/Mutex/Semaphore/Event (0) | 2014.02.18 |
fopen_s,fread,fwrite,fclose 사용법 (0) | 2014.02.18 |
쓰레드의 진실 - CreateThread,_beginthread,_beginthreadex,AfxBeginThread (0) | 2014.02.18 |
댓글