날마다 새롭게 또 날마다 새롭게

가상함수(Virtual Function) 본문

프로그래밍/C / C++

가상함수(Virtual Function)

아무유 2012. 10. 10. 19:32

부모 클래스의 포인터는 자식 클래스를 가리킬 수 있으나 자식 클래스의 멤버에는 접근하지 못한다. 다음과 같이 부모 클래스 포인터가 자식 클래스를 가리키고 있을 때를 살펴보자.

먼저 First <- Second <- Third 의 상속관계를 가지고 있고 각각의 클래스에는 자신의 클래스 이름을 출력하는 MyFunc 라는 함수가 오버라이딩 되어있다고 가정한다.

 Third* tptr = new Third();

Second* sptr = tptr;

First* fptr = sptr;

Third 클래스를 생성하고 Second, First 클래스 포인터로 이를 가리키도록 한다. 그리고 각각의 포인터로 MyFunc 함수를 호출한다.

fptr->MyFunc;

sptr->MyFunc;

tptr->MyFunc;

 결과가 어떻게 되겠는가? 부모 클래스는 자식 클래스를 가리킬 수는 있으나 자식 클래스 멤버를 사용하지는 못하므로, C++ 컴파일러는 실제 가리키는 객체의 자료형을 기준으로 하지 않고 포인터의 자료형을 기준으로 하여 함수를 호출하게 된다. 그러므로 결과는 다음과 같다.

FirstFunc

SecondFunc

ThirdFunc

 그렇다면 포인터의 자료형이 아닌 실제 가리키는 객체의 자료형을 기준으로 함수 호출은 어떻게 할 수 있는가? 바로 가상함수(Virtual Function)을 이용하면 포인터의 자료형을 기준으로 하는 것이 아니라 포인터가 실제로 가리키는 객체를 참조하여 호출의 대상을 결정한다.

 가상함수를 사용하여 같은 문장으로 다른 결과를 볼 수 있는데, 이를 다형성이라고 한다.

First *ptr = new First();

ptr->MyFunc;

delete ptr;

ptr = new Second();

ptr->MyFunc;

delete ptr;

ptr->MyFunc; 문장은 같으나 두 문장의 출력 결과는 다르다. 


Comments