728x90
오버라이드는 상속관계에서 함수 자신의 내부에서 관련 함수를 찾아서 동작하기 때문에 내부 함수가 있다면
부모쪽으로 넘어가지 않으니 자연히 자기가 가진 함수가 동작하게 된다
가상함수는 내부에서 결정하지 않고 포인터가 실제 가르키는 객체에서 동작을 하게 된다
설명이 조잡하지만, 예제를 보면 이해가 될테고 활용하는데 도움이 될 듯.
관련 내용 추천도서는 effective c++ 이다.. 뭐 지금은 이 바닥 교과서 처럼 된 듯
예제
#include "stdafx.h" #include <iostream> #include <string> #include <list> class CItem { public: virtual void Run() const = 0; void IsA() { std::cout << "아이템 입니다" << std::endl; } virtual void Desc() { std::cout << "잡템" << std::endl; } }; class CUseItem : public CItem { public: void Run() const { std::cout << "아이템을 사용 하였습니다" << std::endl; } void IsA() { std::cout << "사용가능한 아이템 입니다" << std::endl; } virtual void Desc() { std::cout << "사용하면 사라집니다" << std::endl; } }; class CEquipItem : public CUseItem { public: void Run() const { std::cout << "아이템을 장착하였습니다" << std::endl; } void IsA() { std::cout << "장착가능한 아이템 입니다" << std::endl; } virtual void Desc() { std::cout << "검계열 무기 입니다" << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { std::cout << "오버라이드 ----------" << std::endl; { CEquipItem *pEquip = new CEquipItem; CUseItem *pUseItem = pEquip; CItem *pItem = pUseItem; pEquip->IsA(); pUseItem->IsA(); pItem->IsA(); delete pEquip; } std::cout << "가상함수 ----------" << std::endl; { std::auto_ptr<CItem> pPotion(new CUseItem); std::auto_ptr<CItem> pMeat(new CUseItem); std::auto_ptr<CItem> pSword(new CEquipItem); pPotion->IsA(); pPotion->Desc(); pPotion->Run(); pMeat->IsA(); pMeat->Desc(); pMeat->Run(); pSword->IsA(); pSword->Desc(); pSword->Run(); } int in; std::cin >> in ; return 0; }
결과
728x90
'프로그래밍 > C++ / API' 카테고리의 다른 글
미리 컴파일된 헤더의 가상 메모리 범위 초과 (0) | 2012.11.23 |
---|---|
디아블로3 채팅 아이템 정보 넘기기 (0) | 2012.05.21 |
환경 변수 설정 (0) | 2012.03.02 |
char* / char[] 공백문자 제거 (0) | 2011.11.02 |
소스코드 인용구 테스트 < (0) | 2011.10.24 |
댓글