본문 바로가기
프로그래밍/C++ / API

오버라이드(Override)와 가상함수(Virtual Function)

by neive 2012. 9. 6.
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

댓글