以文本方式查看主题

-  计算机科学论坛  (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