以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 如何偷出类里面proteced的虚函数? (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=89099) |
-- 作者:葛靖青001 -- 发布时间:1/11/2011 4:13:00 PM -- 如何偷出类里面proteced的虚函数? 【转自互联网】 01 class empty_class{ 02 private: 03 int i; 04 protected: 05 void virtual do_something(){ 06 cout<<"do somtthing"<<endl; 07 } 08 void virtual do_another(){ 09 cout<<"do another"<<endl; 10 } 11 }; 12 13 int main(int argv, char*args[]) 14 { 15 typedef void (*func)(); 16 empty_class *p_ec = new empty_class(); 17 int *p = (int *)(p_ec); // *p 是虚函数表的地址 18 int *q = (int *)(*p); // *q 是第一个函数的地址 19 func f = (func)(*q); 20 f(); 21 func g = (func)(*q - 4); 22 g(); 23 system("pause"); 24 return 0; 25 } 上面的例子偷出了类里面protected修饰的函数; 这个例子对理解对象内存结构有很大帮助。 类里面如果什么都没有,sizeof的结果是1,测试过里面放的是0; 类里面如果仅仅有一个虚函数,那么对象内存里面存的就是虚函数表的指针 将对象指针解引用就是虚函数表的指针,再解引用就是虚函数表的首函数地址。 需要注意虚函数是倒着存的,要得到第二个就要地址减4; 上述代码运行后能执行类里面的那两个虚函数。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
31.250ms |