글
가상 함수에 대한 이해
Programming/C++ Language
2009. 9. 25. 23:09
가상 함수 의 기본 개념은 책에 다 나와있을 뿐더러, 다들 많이 알기 때문에 개념에 대해서는 간단히 설명 하도록 하겠다.
가상 함수란 동적 결함을 하는 함수이다. 일반적인 함수는 컴파일 시점에서, 이미 어디로 갈지 정적 결합이 일어나지만, 가상 함수의 경우에는 포인터 타입에 실제로 어떤 값이 들어갈지 컴파일 시점에 알 수 없기 때문이다.
자, 그럼 이러한 동적 결합은 어떻게 구현 되는 것일까? 가상 함수를 어떻게 구현 하라는 명시적인 방법은 없으며, 컴파일러 마다 틀리다. 어쨌든, 가상 함수에 맞도록 동작만 하면 된다. 하지만 일반적으로 vtable( 가상 함수 테이블 ) 이라는 가상 함수 목록을 작성하고, 각 객체에 vtable 을 가라키는 숨겨진 멤버 vptr 을 추가하는 방식을 사용한다. vtable 에는 클래스에 소속된 가상함수들의 실제 번지수가 기억되어 있다. 그럼 아래의 예를 보면서 좀 더 구체적으로 살펴보자.
보면 B 클래스가 D의 부모 클래스이다. main 문에서는 B* 형이 있고, 여기에 실제 B와, D 클래스를 대입하여, 함수를 호출 하고 있다. 함수 호출 시, 실제 객체에 있는 vtable 에 대한 메모리 구조가 아래와 같이 나와있다.
B 객체에 있는 가상 함수에 대한 메모리 주소가 vtable에 저장되어 있고,
D 객체의 vtable 에는 D객체에 있는 f1, f2 가상 함수의 주소와 B 클래스에 상속받은 f3 함수의 주소가 저장 되어 있다. B포인터 형에 D객체를 대입해서 f3를 호출 했을 때, B객체의 f3를 호출 해야 하기 때문이다.
출처 : www.winapi.co.kr
가상 함수란 동적 결함을 하는 함수이다. 일반적인 함수는 컴파일 시점에서, 이미 어디로 갈지 정적 결합이 일어나지만, 가상 함수의 경우에는 포인터 타입에 실제로 어떤 값이 들어갈지 컴파일 시점에 알 수 없기 때문이다.
자, 그럼 이러한 동적 결합은 어떻게 구현 되는 것일까? 가상 함수를 어떻게 구현 하라는 명시적인 방법은 없으며, 컴파일러 마다 틀리다. 어쨌든, 가상 함수에 맞도록 동작만 하면 된다. 하지만 일반적으로 vtable( 가상 함수 테이블 ) 이라는 가상 함수 목록을 작성하고, 각 객체에 vtable 을 가라키는 숨겨진 멤버 vptr 을 추가하는 방식을 사용한다. vtable 에는 클래스에 소속된 가상함수들의 실제 번지수가 기억되어 있다. 그럼 아래의 예를 보면서 좀 더 구체적으로 살펴보자.
보면 B 클래스가 D의 부모 클래스이다. main 문에서는 B* 형이 있고, 여기에 실제 B와, D 클래스를 대입하여, 함수를 호출 하고 있다. 함수 호출 시, 실제 객체에 있는 vtable 에 대한 메모리 구조가 아래와 같이 나와있다.
B 객체에 있는 가상 함수에 대한 메모리 주소가 vtable에 저장되어 있고,
D 객체의 vtable 에는 D객체에 있는 f1, f2 가상 함수의 주소와 B 클래스에 상속받은 f3 함수의 주소가 저장 되어 있다. B포인터 형에 D객체를 대입해서 f3를 호출 했을 때, B객체의 f3를 호출 해야 하기 때문이다.
출처 : www.winapi.co.kr
'Programming > C++ Language' 카테고리의 다른 글
namespace (0) | 2010.03.19 |
---|---|
연산자 오버로딩 (0) | 2009.09.30 |
순수 가상 함수 (0) | 2009.09.26 |
가상 함수의 활용 (0) | 2009.09.25 |
Static Member (0) | 2009.05.31 |