对象的消息模型
[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]
C++对象模型
话题从下面这段C++程序说起,你认为它可以顺利执行吗?
//C++ class A { public: void Hello(const std::string& name) { std::cout << "hello " << name; } }; int main(int argc, char** argv) { A* pa = NULL; //!! pa->Hello("world"); return 0; }
试试的确可以顺利运行输出hello world,奇怪吗?其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:
void A_Hello_xxx(A * const this, const std::string& name) { std::cout << “hello “ << name; }
对象指针其实是作为第一个参数被隐式传递的,pa->Hello(“world”)实际上是调用的A_Hello_xxx(pa, “world”),而恰好A_Hello_xxx内部没有使用pa,所以这段代码得以顺利运行。
对象的消息模型
如果是研究C++对象模型,上面的讨论可以到此为止,不过这里我想从另一个层面来继续探讨这个问题。OOP的先驱人物Alan Kay在总结Smalltalk的OO特征时强调: