250x250
Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 09-1 : 멤버함수와 가상함수의 동작 원리 본문

Programming Lang/C++

C++ Chapter 09-1 : 멤버함수와 가상함수의 동작 원리

시데브 2023. 7. 20. 15:41
728x90

멤버함수의 동작원리

  • 멤버변수와 달리, 멤버함수는 객체 내부에 존재하는 것이 아니고 메모리의 한 공간에 별도로 존재한다.
  • 해당 함수가 정의된 클래스의 모든 객체가 이 함수를 공유하는 형태이다.

가상함수의 동작원리와 가상함수 테이블

 가상함수의 동작원리를 알아보기 위해 예제를 하나 살펴보자.

#include <iostream>
using namespace std;

class AAA
{
private:
    int num1;
public:
    virtual void Func1() { cout<<"Func1"<<endl; }
    virtual void Func2() { cout<<"Func2"<<endl; }
};

class BBB : public AAA
{
private:
    int num2;
public:
    virtual void Func1() { cout<<"BBB::Func1"<<endl; }
    void Func3() { cout<<"Func3"<<endl; }
};

int main(void)
{
    AAA * aptr = new AAA();
    aptr -> Func1();

    BBB * bptr = new BBB();
    bptr -> Func1();

    return 0;
}
Func1
BBB::Func1

 한 개 이상의 가상함수를 포함하는 클래스에 대해서는 컴파일러가 다음 표(클래스 AAA의 V-Table)와 같은 형태의 '가상함수 테이블'(V-Table(Virtual Table))이란 것을 만든다. 이는 실제 호출되어야 할 함수의 위치정보를 담고 있는 테이블이다. 

key value
void AAA::Func1() 0x1024 번지
void AAA::Func2() 0x2048 번지

 해당 테이블에는 key와 value가 포함되어있는데 다음 의미를 가진다.

  • key : 호출하고자하는 함수를 구분지어주는 구분자 역할
  • value : 구분자에 해당하는 함수의 주소정보를 알려주는 역할 

 아래는 클래스 BBB의 V-Table인데, AAA 클래스의 오버라이딩 된 가상함수 Func1에 대한 정보가 존재하지 않는다.

key value
void BBB::Func1() 0x3072 번지
void AAA::Func2() 0x2048 번지
void BBB::Func3() 0x4096 번지

  이를 통해서 오버라이딩 된 가상함수의 주소정보는 유도 클래스의 가상함수 테이블에 포함되지 않음을 알 수 있다.

 

가상함수의 테이블이 참조되는 방식

 가상함수 테이블은 main 함수가 호출되기 이전부터 객체의 생성과 관계없이 메모리 공간에 할당된다.이후 객체가 생성되면 각각의 객체에는 클래스에 맞는 가상함수 테이블의 주소값이 저장되고(하나 이상의 가상함수를 멤버로 가지는 클래스), 이 테이블의 주소값을 참조하고 나서야 함수에 접근할 수 있다.

 


출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12 

728x90