C++/Class
2021. 3. 20. 17:49
가상 (함수) 테이블 (Virtual Tables)
- virtual 키워드를 사용하면 내부적으로 가상 테이블의 주소가 저장된다.
예제
간단한 상속 예제
class Base
{
public:
// FunctionPointer *_vptr;
virtual void func1() {}
virtual void func2() {}
};
class Derived : public Base
{
public:
// FunctionPointer *_vptr;
virtual void func1() {}
};
여기서 클래스들의 가상 테이블은 다음과 같다.
Base VTable 가리키고 있는 함수 func1 Base::func1 func2 Base::func2
Derived VTable 가리키고 있는 함수 func1 Derived::func1 func2 Base::func2
사이즈 출력해보기
가상 함수를 사용하지 않는 경우
- 객체의 크기가 1바이트씩 나온다.
#include <iostream> class Base { public: // FunctionPointer *_vptr; void func1() {} void func2() {} }; class Derived : public Base { public: // FunctionPointer *_vptr; void func1() {} }; int main() { using namespace std; cout << sizeof(Base) << endl; cout << sizeof(Derived) << endl; } /* stdout 1 1 */
가상 함수를 사용할 경우
x86
에서는 4바이트,x64
에서는 8바이트가 나온다.- 이는 주소의 크기이다.
#include <iostream> class Base { public: // FunctionPointer *_vptr; virtual void func1() {} virtual void func2() {} }; class Derived : public Base { public: // FunctionPointer *_vptr; virtual void func1() {} }; int main() { using namespace std; cout << sizeof(Base) << endl; cout << sizeof(Derived) << endl; } /* stdout (x86) 4 4 */ /* stdout (x64) 8 8 */
'C++ > Class' 카테고리의 다른 글
C++ 추상 기본 클래스 (Abstract class) (0) | 2021.03.21 |
---|---|
C++ 순수 가상 함수 (Pure Virtual Function) (0) | 2021.03.21 |
C++ 동적 바인딩 (Dynamic Binding) (0) | 2021.03.20 |
C++ 정적 바인딩 (Static Binding) (0) | 2021.03.20 |
C++ 가상 소멸자 (0) | 2021.03.20 |