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 |