C++ Chapter 12.6 : 가상 함수표

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 12. 가상 함수들 : 가상 함수표

🔔 가상 함수표

virtual 가상 함수가 선언되면 가상 함수 표를 만들고 동적 바인딩 한다.

  • 클래스는 가상함수표에 대한 포인터를 갖게 된다.

image

  • Base 클래스에서 fun1(), fun2() 이렇게 가상 함수 2 개가 선언되있다.
    • 이런 상태에서 Base 타입의 객체를 생성하면 그와 동시에 가상 함수표와 이 가상 함수표의 포인터가 생성된다.
      1. 가상 함수 포인터 *_vptr 를 보고 가상 함수표를 찾아간다.
      2. 가상 함수표에서 가상 함수인 fun1, fun2의 포인터를 받아 온서 돌아온다.
      3. 받아 온 주소를 통해 fun1, fun2 를 실행한다.

image

  • Derived 클래스에도 그대로 가상함수표의 포인터가 상속된다.
    1. 상속 받은 가상 함수 포인터 *_vptr 를 보고 가상 함수표를 찾아간다.
    2. 가상 함수표에서 가상 함수인 Base 클래스의 fun1, fun2의 포인터를 받아 온서 돌아온다.
    3. fun1 은 오버라이딩이 되어 있으므로 포인터를 통해 찾아가지 않고 본인이 오버라이딩 한 fun1을 실행하고 fun2 은 가상 함수표에서 찾아 온 Base의 fun2주소를 보고 fun2를 실행한다.

클래스의 크기 비교

가상 함수를 가지는 클래스는 가상 함수 포인터를 추가로 가지기 때문에 클래스 용량이 더 크다

가상 함수를 가지고 있지 않을 때

#include <iostream>

using namespace std;

class Base
{
public:
    void fun1() {};
    void fun2() {};
};

class Derived : public Base
{

};

int main()
{
    cout<< sizeof(Base) << endl;
    cout<< sizeof(Derived) << endl;

    return 0;
}
💎출력💎

1
1

가상 함수를 가지고 있을 때

#include <iostream>

using namespace std;

class Base
{
public:
    virtual void fun1() {};
    virtual void fun2() {};
};

class Derived : public Base
{

};

int main()
{
    cout<< sizeof(Base) << endl;
    cout<< sizeof(Derived) << endl;

    return 0;
}
💎출력💎

4
4
  • Base는 가상 함수를 가지므로 가상 함수 포인터를 가지고 있다.
    • 따라서 가상 함수 포인터 때문에 가상 함수를 가지지 않았을 때보다 크기가 더 커졌다.
  • Derived는 Base로부터 가상 함수 포인터를 상속받기 때문에 얘도 똑같이 크기가 더 커졌다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기