C++ Chapter 12.6 : 가상 함수표
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 12. 가상 함수들 : 가상 함수표
🔔 가상 함수표
virtual
가상 함수가 선언되면 가상 함수 표를 만들고 동적 바인딩 한다.
- 클래스는
가상함수표
에 대한 포인터를 갖게 된다.
- Base 클래스에서 fun1(), fun2() 이렇게 가상 함수 2 개가 선언되있다.
- 이런 상태에서 Base 타입의 객체를 생성하면 그와 동시에 가상 함수표와 이 가상 함수표의 포인터가 생성된다.
- 가상 함수 포인터
*_vptr
를 보고 가상 함수표를 찾아간다. - 가상 함수표에서 가상 함수인 fun1, fun2의 포인터를 받아 온서 돌아온다.
- 받아 온 주소를 통해 fun1, fun2 를 실행한다.
- 가상 함수 포인터
- 이런 상태에서 Base 타입의 객체를 생성하면 그와 동시에 가상 함수표와 이 가상 함수표의 포인터가 생성된다.
- Derived 클래스에도 그대로 가상함수표의 포인터가 상속된다.
- 상속 받은 가상 함수 포인터
*_vptr
를 보고 가상 함수표를 찾아간다. - 가상 함수표에서 가상 함수인 Base 클래스의 fun1, fun2의 포인터를 받아 온서 돌아온다.
- 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로부터 가상 함수 포인터를 상속받기 때문에 얘도 똑같이 크기가 더 커졌다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기