본문 바로가기
[ CODING STUDY ]/》C++ 코드실습

C++ [가상함수]

by MRG 2023. 2. 22.
728x90
반응형

▣ 기본클래스, 파생클래스를 선언하고 각각 멤버함수를 선언합니다. 

멤버함수의 이름은 동일하게 선언합니다.

그리고 메인함수에서 GameManager 객체의 포인터, Player 객체의 포인터를 각각 정의하고 위에 코드처럼

GameMaanger클래스의 주소로 접근하여 멤버함수를 호출하는 코드, Player클래스의 주소를 pGameManager 함수에 대입하여 멤버함수를 호출하는 코드를 작성합니다.

 

▣ 디버그를 해보면 둘 다 GameManager 클래스의 멤버함수가 호출되는 걸 확인할 수 있습니다. 

 

▣  그 이유는 정적바인딩으로 컴파일할 때 호출될 함수의 주소가 이미 결정해 버렸기 때문에

pGameManager = pPlayer; 이렇게 코드를 작성하더라도 부모의 함수가 호출됩니다. 

 

▣ 이럴 때 가상함수(Virtual)를 사용하면 됩니다. 

 

▣ GameManager와 Player클래스의 멤버함수에 반환형 앞에 virtual 키워드를 추가합니다.

 

▣ 그리고 디버그를 찍어보면 위에 이미지처럼 각각 다른 클래스의 멤버함수를 호출한 걸 확인할 수 있습니다. 

 

▣ 다시 정리하면 정적바인딩이 아닌 동적바인딩을 해야 우리가 원하는 주소를 지정해서 함수를 호출할 수 있습니다.

동적바인딩을 하려면 일반 함수를 가상함수로 바꾸어야 합니다.

그러기 위해서는 가상함수로 바꿀 함수 반환형 앞에 virtual 키워드를 붙이면 됩니다.
그렇게 가상함수로 선언하면 포인터의 타입이 아닌 포인터가 가리키는 객체의 타입에 따라 주소에  멤버 함수를 호출할 수 있습니다.

728x90
반응형

댓글