學生時代筆記,可能有誤?
不考慮virtual function
c++ sample class1 2 3 4 5 6 7 8 
  | class Base {     public:         void foo();     private:         int i;         static int si; } Base base = Base() 
  | 
 
object memory layout1 2 3 4 5 6 
  | base:   int i Out Of base(like global):   static int si   void foo(this) //this pointer point to reference object 
  | 
 
考慮繼承與virtual function
c++ sample class1 2 3 4 5 6 7 8 9 10 11 12 13 14 
  | class Base {     public:         virtual void foo();     private:         int i; } class Derived : Base {     public:         virtual void foo();     private:         int j; } Base *base = new Derived(); base.foo();  
  | 
 
object memory layout1 2 3 4 5 6 7 8 9 10 11 12 13 14 
  | base:   Vtable* vtable   int i derived:   Base portion:     Vtable* vtable     int i   int j vtable:   function pointer   function pointer   ... 
  | 
 
Compiler在編譯期間會對Base與Derived的vtable塞入其foo的function pointer
Base vtable 塞 Base的foo的function pointer(compiled time)
Derived vtable 塞 Derived的foo的function pointer(compiled time)
當runtime時確定base的type後base.foo會根據derived裡的vtable去找到foo的真正位置
Reference
The virtual table