Program Languege/C/C++

가상함수

Frozen0113 2013. 3. 19. 18:59

가상함수

 

virtual 키워드가 붙은 함수로 가상함수 테이블을 생성하며 현재 참조하고 있는 객체에 맞는 함수 호출을 할 수 있게된다.

 

 

헤더 파일                                                                         cpp 파일

 

 

 

 

 

 

 

 

 

 

 

 

메인

 

 

 

 

 

 

 

위의 예제에서 실행 결과를 예측해보고 다음 결과를 보길 바란다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실제로 가리키고 있는 객체는 Three클래스의 객체이지만 포인터의 클래스에 따라 다른 함수들이 호출되었다.

바로 이 문제가 위에서 언급한 문제이다.

 

 

 

 

다음은 한가지 더 문제를 더 보여주도록 하겠다.

 

 

 

헤더 파일                                                                            cpp 파일                                                  

 

 

 

메인

 

 

 

실행을 하면 어떤 문제가 발생할까?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

분명 자식 객체를 동적으로 할당했는데 소멸자는 부모의 소멸자만 생성되었다.

 

위에서 제시한 문제와 지금 제시한 문제의 공통점을 본다면 부모 클래스의 포인터와 그안에 들어있는 객체는 자식 클래스의 객체라는 점이다. 자식 클래스를 부모 클래스로 형변환 하는 것은 업캐스팅으로 명시적 형변환 없이 형변환이 가능하며(암묵적 형변환이 일어난다.)

문제가 되지 않을 것이라 생각했지만 포인터의 형만을 생각하고 부모 클래스의 소멸자만 호출 되는 것이다.

 

 

 

이를 해결하기 위해 virtual 키워드를 사용하는 것이다.

 

 

 

virtual 키워드를 사용하면 가상함수 테이블이라는 것이 생성되며 어떤 클래스의 포인터든지 상관없이 현재 참조하는 객체에 따라 그에 맞는 함수가 호출되도록 해주는 것이다.

 

 

 

 

virtual 키워드를 사용해 문제 해결1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

virtual 키워드를 사용해 문제 해결2