Virtual function은 dynamic function binding이며 런타임 중 바인딩이 된다
function overloading은 static function binding이며 컴파일 시 바인딩이 된다
virtual 키워드가 사용되면
virtual table pointer (8바이트)가 추가되고
그에 맞게 padding이 진행되어 사이즈가 결정된다
virtual table pointer를 타고 가면 나오는 virtual table에
해당하는 클래스의 멤버 함수들이 저장되어 있기 때문에
부모 클래스로 자식을 생성하더라도 자식 멤버 클래스가 실행이 된다
또한, 아래의 코드에서 볼 수 있듯이
런타임 중 발생하는 상황에 따라서
바인딩이 달라질 수 있다
#include <iostream>
#include <vector>
class Base
{
private:
int a;
// VTable * vt;// 8바이트
public:
virtual void f();
}
class Derived : public Base
{
public:
void f() override;
}
int main()
{
std::cout << sizeof(Base) << std::endl;
// 4바이트 + padding(4바이트) + 8바이트 = 16바이트
Derived d;
Base b;
Base* pb;
if (condition)// 런타임 중 결정
{
pb = &d;
}
else
{
pb = &b;
}
}
'C++ > [노코프] Tips' 카테고리의 다른 글
[C++ Tips] std::string (0) | 2024.04.06 |
---|---|
[C++ Tips] 상속의 문제점 (0) | 2024.04.06 |
[C++ Tips] 클래스/구조체 멤버 정렬 (0) | 2024.04.05 |
[C++ Tips] switch case (0) | 2024.04.05 |
[C++ Tips] Unit Test (0) | 2024.04.05 |