虚函数表 & 指针
2009-04-30 13:37
120 查看
今天看了hairetz转载的一篇关于虚函数表的文章,的确很好
http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
然后对其中的一些问题又重新复习了下,通过下面的代码来解释
http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
然后对其中的一些问题又重新复习了下,通过下面的代码来解释
#include<iostream> using namespace std; class Base { public: virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } }; typedef void(*Fun)(void); int main() { Base b; Fun pFun = NULL; cout<<(int*)*(int*)(&b)<<endl<<endl; //虚函数表的首地址 //注意:虚函数表访问的时候,自己本身有个地址,然后他存储的也是地址(指向函数的地址) cout<<endl; cout<<(Fun)*((int*)*(int*)(&b)+0)<<endl; //虚函数表里存储的函数的地址 cout<<(Fun)*((int*)*(int*)(&b)+1)<<endl; cout<<(Fun)*((int*)*(int*)(&b)+2)<<endl; cout<<endl; cout<<(int *)*((int*)*(int*)(&b)+0)<<endl; cout<<(int *)*((int*)*(int*)(&b)+1)<<endl; cout<<(int *)*((int*)*(int*)(&b)+2)<<endl; cout <<endl; cout <<(Fun)((int*)*(int*)(&b)+0) <<endl; // 虚函数表里自己本身的地址 cout <<(Fun)((int*)*(int*)(&b)+1) <<endl; cout <<(Fun)((int*)*(int*)(&b)+2) <<endl; cout <<endl; cout <<(int *)((int*)*(int*)(&b)+0) <<endl; cout <<(int *)((int*)*(int*)(&b)+1) <<endl; cout <<(int *)((int*)*(int*)(&b)+2) <<endl; return 0; } /* 0046F01C //虚函数表的首地址 0040122B //虚函数表里存储的函数的地址 004010AF 004012AD 0040122B 004010AF 004012AD 0046F01C //虚函数表里自己本身的地址 0046F020 0046F024 0046F01C 0046F020 0046F024 Press any key to continue */
相关文章推荐
- C++引用&和指针在作为形参时的区别
- C++内存管理——指针&&数组
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- p指针->AddRef() 和 p指针->Relase()
- C++内存管理——指针&&数组
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- c++:成员指针运算符 .* 和 ->*
- C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
- 单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
- C++引用 && 指针
- 【转】vtbl(虚函数表)与vptr(虚函数表指针)
- 指针数组&数组指针
- 数组指针与 数组名 a和&a
- PHP-popen() 函数打开进程文件指针
- C++指向虚函数表指针存放位置
- 【2015/11/1】C学习日志_Day11&12 数据类型 指针 内存对齐 函数指针
- 指针与数组&&指针与函数
- 关于指针结构体函数中指针变量的赋值&的问题思路
- C语言中的空指针、空指针常量、NULL & 0
- 数组与指针---都是"退化"惹的祸