发表于 2010-7-3 23:00 | 来自 51CTO网页
[只看他] 沙发
1. 楼主求知精神值得学习
2. 给你解释的人说的基本上是正确的。
成员函数编译以后就是普通的函数,
比如Base的Print被改名为void Print_Base_xxxxx(Base* pBase);
那b->Print被转为Print_Base_xxxxx(NULL);
其实更激烈点的方式,比如Derived继承于Base,它实现了Print这个函数。
你在main里面调用
Derived* pDerived = NULL;
pDerived->Print;
再做一个假设,你想crack这个编译后的可执行程序。
你找个反汇编工具,看到函数调用call ptr[derived_print_xxx]类似这样一条语句,把它改为call ptr[base_print_xxx].再运行程序,你会发现调用的是Base的Print。
所以说成员函数和普通的非成员函数没有本质的区别(起码编译以后是这样),调用的方法也是一样的。
3. 编译器实现问题楼主不必深究。如果有兴趣你可以去windws mobile资源区看看ansi c++ standard,看看里面有没有对这个的实现做出具体的规定。如果c++ standard没有具体规定,那么不同的c++厂商怎么实现自己定。