가상 함수 (Virtual Function)
Programming/C++ 2012. 8. 19. 20:40 |※ C++ 컴파일러는 포인터를 이용한 연산의 가능성 여부를 판단할 때, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.
위의 예제에서 func함수는 모두 오버라이딩 관계를 형성하고 있다.
fptr->Func(); => fptr이 First형 포인터이니, 이 포인터가 가리키는 객체를 대상으로 First 클래스에 정의된 Func()함수는 무조건 호출한다.
sptr->Func(); => sptr이 Second형 포이터이니, 이 포인터가 가리키는 객체에는 First의 Func함수와 Second의 Func함수가 오버라이딩 관계로 존재한다. 그래서 오버라이딩을 한 Second함수의 Func함수를 호출한다.
## 가상함수
가상함수를 쓰는 이유?
"함수를 오버라이딩을 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미인데, 포인터 변수의 자료형에 다라서 호출되는 함수의 종류가 달라지는 것은 문제가 있어 보인다."
그래서 C++은 이러한 상황이 발생하지 않도록 "가상함수"라는 것을 제공한다. 그런데 이 가상함수라는 것은 C++의 개념이 아닌 객체지향의 개념이다. 따라서 C++뿐만이 아니라 JAVA, C#과 같은 객체제향 언어에서도 이와 동일한 개념의 문법이 제공되고 있다.
가상함수의 선언은 virtual 키워드의 선언을 통해서 이뤄진다. 그리고 이렇게 가상함수가 선언되고 나면, 이 함수를 오버라이딩 하는 함수도 가상함수가 된다.
함수가 가상함수로 선언되면, 해당 함수호출 시 포인터의 자료형을 기반으로 호출대상을 결정하지 않고, 포인터 변수가 실제로 가리키는 객체를 참조하여 호출의 대상을 결정한다.
'Programming > C++' 카테고리의 다른 글
가상 소멸자(Virtual Destructor) (0) | 2012.08.20 |
---|---|
순수 가상함수(Pure Virtual Function)와 추상 클래스(Abstract Class) (0) | 2012.08.19 |
상속과 다형성 (0) | 2012.06.23 |
Control 클래스 & Entity 클래스 (0) | 2012.06.22 |
상속을 이용한 프로그램 (0) | 2012.06.21 |