가상함수총정리( 동적바인딩,정적바인딩,가상함수테이블)

 
1.가상함수
 
1)가상함수가 아닌 보통의 경우 부모클래스형 포인터로 멤버함수를 호출할때, 
컴파일러는 정적타입을 보고 이타입에 맞는 멤버함수를 호출한다. (이런 함수를 비가상함수라고함)
실행중 동적타입에 따른 함수를 부르기위해 가상함수를쓴다. 동적바인딩시킨다.


2)가상함수란?
=>한마디로 표현하면 동적 결합을 하는 함수  
가상함수란, 포인터의 정적 타입이 아닌 동적 타입에 따르는 함수이다.
( 가상함수로 선언하면 포인터의 타입이 아닌 포인터가 가리키는 객체의 타입에 따라 멤버 함수를 선택한다 )

2)virtual키워드를 선언부에 넣어주면 가상함수가 된다.
부모 클래스 하나만 써주면 다 가상함수가 됨.
무조건 선언부에 써야됨 (정의부에 쓰면 에러남) 
  

*동적결합, 정적결합이란?

=동적바인딩(dynamic 

binding), 정적바인딩(static binding)

바인딩(binding): 함수 호출문에 대해 실제 호출될 함수의 번지를 결정하는 것.


정적바인딩: 함수 호출문에대한 번지가 컴파일시 이미 정해져있는것

동적바인딩: 함수 호출문에 대한 번지가 컴파일시가 아닌 실행중에 호출할 함수를 결정하는것.

                  이것은 가상함수 테이블을 이용한다.

                  그리고 중요한것은 동적바인딩은 포인터(또는 레퍼런스)로 호출할때만 동작함

                  (이유는 포인터가아니면 어떤 객체에대해서 함수인지 알수있으므로 정적바인딩됨 !!! 당연한것)

 
 








2.가상함수테이블(vtable)

가상함수를 가지는 클래스는 가상함수 테이블을 가지고있고,
클래스 안에서는 이 테이블을 지시할수있는 Pointer 를가지고있다
( 이때문에 가상함수를 가지는 클래스는 크기가 4바이트 추가 할당됨!! 가상함수가 아니면 추가 안됨) 
가상함수테이블은 가상함수들만 들어가고, 가상함수주소들의 배열형태로 존재함
참고로, 한 클래스에서 많은 가상함수를 가지고 있더라도 같은 vtable을 사용한다!(당연한가?) 

가상함수 실행 로직 이해:
실행중에 호출할 함수를 결정한다기보다 호출할 함수의 목록을 vtable에  미리 작성해 놓고 
실행중에는 객체의 vtable을 찾고 vtable에서 다시 호출할 함수의 번지를 찾는 방법이다!!!!
(컴파일시 예비 동작을 취해놓는다)

수도코드로 표현해보면 
p -> vptr -> vtable[n] 호출 (여기서 n은 컴파일시 설정된다)

당연히 동적결합은 정적결합보다 호출 속도가 느리다.(하지만 요즘시대에 하드웨어는 그리 문제 되지 않겠지?)

가상함수테이블 동작원리를 잘 나타내준 블로그







3. 가상함수를 쓰는 이유, 사용해야되는 경우

1)이유:
부모클래스형 포인터로 멤버함수를 호출할때, 
컴파일러는 정적타입을 보고 이타입에 맞는 멤버함수를 호출한다.(비가상함수)
그래서 정적타입이 아닌 동적타입에 따른 함수를 부르기위해 가상함수를쓴다. 동적바인딩시킨다.

즉 풀어서 얘기해보면 부모클래스형 포인터로 멤버함수를 호출할때, 
비가상함수는     포인터가 어떤객체를 가리키는가 상관없이 항상 포인터타입 클래스의 멤버함수를 호출.(컴파일중)
가상함수는        포인터가 가리키는 실제 객체의 함수를 호출.(실행중)


2)사용해야되는 경우)
그래서 재정의할 가능성이 있는 멤버 함수는 가상함수로 선언하는것이 좋다!!!
(하지만 이것을 어찌알겠냐...)
(가상함수를 쓰면 가상함수 테이블 4바이트가 추가로 메모리에 할당됨)

보통 재사용가능성이 많은 소멸자를 가상함수로 만들어준다!!( 가상 파괴자라고 함 )
기반 클래스의 소멸자는 반드시 가상으로 선언해야한다. 


3) 가상함수 활용
1. 이 클래스로부터 자식 클래스가 파생될 가능성이 조금이라도 있어야 한다.
2. 파생클래스에서 함수의 동작을 재정의할 가능성이 조금이라도 있어야한다.
3. 부모 클래스 타입의 포인터로부터 호출할 가능성이 조금이라도 있어야한다. 




4. C++과 자바의 차이중 하나


C++은 디폴트가 비가상함수이고,

자바는 디폴트가 가상함수이다!!! (Oh ho)




 

www.winapi.com 혼연을 보고 정리!!!
아 엄청 깔끔하게 정리 한것같다 ㅎㅎㅎ
오랜만에 김정리 나왔음 ㅎㅎㅎ 

 

이 글을 공유하기

댓글

Designed by JB FACTORY