'virtual function'에 해당되는 글 1건

  1. 2012.08.19 가상 함수 (Virtual Function)



※ C++ 컴파일러는 포인터를 이용한 연산의 가능성 여부를 판단할 때, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.


위의 예제에서 func함수는 모두 오버라이딩 관계를 형성하고 있다. 


fptr->Func();         => fptr이 First형 포인터이니, 이 포인터가 가리키는 객체를 대상으로 First 클래스에 정의된 Func()함수는 무조건 호출한다. 


sptr->Func();        => sptr이 Second형 포이터이니, 이 포인터가 가리키는 객체에는 First의 Func함수와 Second의 Func함수가 오버라이딩 관계로 존재한다. 그래서 오버라이딩을 한 Second함수의 Func함수를 호출한다. 



## 가상함수


가상함수를 쓰는 이유? 

"함수를 오버라이딩을 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미인데, 포인터 변수의 자료형에 다라서 호출되는 함수의 종류가 달라지는 것은 문제가 있어 보인다."


그래서 C++은 이러한 상황이 발생하지 않도록 "가상함수"라는 것을 제공한다. 그런데 이 가상함수라는 것은 C++의 개념이 아닌 객체지향의 개념이다. 따라서 C++뿐만이 아니라 JAVA, C#과 같은 객체제향 언어에서도 이와 동일한 개념의 문법이 제공되고 있다. 


가상함수의 선언은 virtual 키워드의 선언을 통해서 이뤄진다. 그리고 이렇게 가상함수가 선언되고 나면, 이 함수를 오버라이딩 하는 함수도 가상함수가 된다. 




함수가 가상함수로 선언되면, 해당 함수호출 시 포인터의 자료형을 기반으로 호출대상을 결정하지 않고, 포인터 변수가 실제로 가리키는 객체를 참조하여 호출의 대상을 결정한다. 

    

Posted by scii
: