본문 바로가기

Programming/Cocos2D

vitual 가상함수

가상 함수

 

가상함수는 기본 클래스에서 virtual 로 선언되고 파생클래스에서 재정의 되는 함수다.

따라서 각 파생클래스는 자신만의 가상 함수 버전을 가질 수 있다.

 

 

base와 first_d ,second_d모두 who()라는 함수를 각각 호출할수있다.

base에서 who()는 가상함수로 선언된다. 이것은 이 가상함수가 파생클래스에 의해 재정의 될 수 있음을 의미한다.

그리고 기본 클래스 포인터는 파생 클래스의 객체를 참조할 수 있다. 그래서 who()가 호출될 때, C++는 p가 어느 형의 객체를 가리키고 있는지 확인하고 그 형에 근거하여, 어느 버전의 who()를 호출할 것인가를 결정한다


만약 가상함수가 아닌 일반함수로 선언되면...

 

결과를 보면 앞선 결과와는 전혀 다른 값이 출력된 것을 볼 수 있다.

부모의 포인터가 자식을 가리키고 있기 때문에 당연히 자식의 함수가 호출될거라 기대했지만 결과는 모두 부모의 함수만 호출이 된 것이다.

그 이유는 포인터의 형이 정해진 시점에서 이미 멤버 함수의 호출이 결정되어 있기 때문이다.

즉, 포인터가 무엇을 가리키든 상관없이 이미 이 포인터가 부모타입(base)이기 때문에 호출되는 함수도 부모의 것으로 이미 정해져 있다는 것이다.

순수 가상함수와 추상 클래스

 

만약 second_d 처럼  상속받아놓고 재정의를 하지 않으면..

이런 에러가 뜰것이다....

second_d에서 재정의 해주면,원하는 결과를 얻을수있다.

 


 

 

'Programming > Cocos2D' 카테고리의 다른 글

Cocos2D프로젝트 포토폴리오  (0) 2015.02.26
스케줄  (0) 2014.12.15
10월 29일 일일보고서  (0) 2014.10.29
10월 28일 작업보고서  (0) 2014.10.28
10월 28일 일일보고서  (0) 2014.10.28