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

virtual(가상)

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 3.




virtual 이라는 키워드는 클래스에서 사용을 하게 되는데

존재 하지만 존재 하지 않는?

소스로 설명하겠다.

#include <iostream>

class AA
{
public:
	// 순수 가상 함수
	virtual void ShowData() = 0;
	virtual ~AA()
	{
		std::cout << "class ~AA()" << std::endl;
	}

};

class BB : public AA
{
public:
	// AA의 ShowData()가 순수 가상 함수 이기 때문에
	// AA를 상속받은 BB에서 꼭 virtual에 대해 재 정의를 해주어야 한다.
	/*virtual*/void ShowData()
	{
		std::cout << "class BB ShowData()" << std::endl;
	}
	~BB()
	{
		std::cout << "class ~BB()" << std::endl;
	}
};

void main()
{
	// 객체 포인터에 의해 값을 받는다.
	AA* a = (AA*)new BB;
	BB* b = new BB;
	// 실제 a에는 ShowData()에서 출력을 하지 못한다.
	// 하지만 virtual 을 통해 BB에 존재하는 showData()를 불러 올 수 있게 된것.
	a->ShowData();
	b->ShowData();

	// b를 지우면 당연히 b의 소멸자를 들리지만
	delete b;
	// a의 소멸자 또한 virtual이기 때문에 b의 소멸자 까지 들리게 된다.
	delete a;
	// AA클래스의 상속을 받은 BB클래스가
	// ShowData()에서 동적 할당을 하였다면,
	// ~BB()에서 해제를 해야 할것이고,
	// 당연히 AA의 소멸자 또한 virtual로 해야한다.
// 결과
// class BB ShowData()
// class BB ShowData()
// class ~BB()
// class ~AA()
// class ~BB()
// class ~AA()
}​


추가로,
static binding과 dynamic binding 이라는 것이 존재 하는데,

void main()
{
	BB b;	// 이와 같이 컴파일 중에 이미 어떤 함수가 호출 될지 정해진 타입이 static binding
	b.ShowData();

	AA* a = (AA*)new BB;	// 이 처럼 실행중에 어떤 함수가 호출 될지 정하는 타입이 dynamic binding 이다.
	a->ShowData();
}​

'프로그래밍 > C++' 카테고리의 다른 글

연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29