每一个C++类有一个metatable
类中的成员函数是直接以<函数名, 函数地址>存在metatable中的;
类中的成员变量则会生成存取函数并分别将<变量名, 存/取函数地址>存入metatable中名为".set"/".get"的二级table中;
子类的metatable的metatable是父类的metatable;
每个metatable都会被设置一组metamethod 比如__newindex/__index 其中:
__newindex
首先获取当前对象的metatable 然后寻找对应的".seti"/".set"函数 找不到则继续向上在父类的metatable中寻找 ...
最终 如果找到则调用对应的".seti"/".set"函数
找不到则说明不是C++类原有的成员函数/变量 调用storeatubox将<k,v>存到当前对象的私有table中
__index
首先在当前对象的私有table中寻找 如果没有的话 获取当前对象的metatable
然后和上述过程类似 递归地寻找对应的".geti"/".get" 找到则调用 找不到则返回nil
(如果k是整数的话, 寻找".geti"; 否则先查询metatable中是否有[k] 没有的话再寻找".get")
每一个C++对象 传进Lua时 传的都是一个userdata 这个userdata里面存的是C++对象的地址 同时 这个userdata的metatable是该对象的类的metatable