关于C++虚表和虚指针
2012-04-15 00:41
225 查看
以下为个人的一些理解,如有不对,敬请大家斧正。
class base { public: virtual void act() { cout << "act_B" << endl; } virtual void fun() { cout << "fun_B" << endl; } }; class derive: base { public: virtual void fun() { cout << "fun_D" << endl; } virtual void act() { cout << "act_D" << endl; } };
虚表是C++用于实现多态的一种方式,每个拥有虚函数的类编译器都会为之分配一张虚表,指向虚表的指针即为虚指针,例如以上两个类base和device,分别就有一张虚表,包含有两个函数fun()和act()。
int main() { derive dd; base bs; base *ptr_b; ptr_b = &bs; int **ptr = (int **) ptr_b; //指向基类对象bs cout << "Addr. of object bs:" << ptr << endl; cout << "Addr. of base::VTABLE: " << *ptr << endl; cout << "Indexing of virtual function bs.act( ):" << "0x00" << hex << **ptr << endl; cout << "Indexing of virtual function bs.fun( ):" << "0x00" << *(*ptr + 1) << endl; ptr++; //指向派生类对象dd cout << "Addr. of object dd:" << ptr << endl; cout << "Addr. of derive::VTABLE:" << *ptr << endl; cout << "Indexing of virtual function dd.act( ):" << "0x00" << hex << **ptr << endl; cout << "Indexing of virtual function dd.fun( ):" << "0x00" << *(*ptr + 1) << endl; return 0; }
由以上例子看出,虚指针存储在对象空间中,由虚指针可以找到虚表,在由虚函数的排列顺序就可以找到每个函数的地址,我当前为高位先存,所以fun()地址比act()大,并且由于内存逻辑上是连续分配的,所以ptr++就可以得到子类对象的地址。
运行结果大家可以到文章用图里找。
参考:
http://wenku.baidu.com/view/a4ca7783e53a580216fcfedf.html
http://page.renren.com/601284443/note/819878679?&ref=share
相关文章推荐
- C++ 第九章 关于类和对象的进一步讨论(二)const的用法和指针数据成员
- C++中关于指针入门的最好的文章
- C/C++中关于地址、指针和引用变量的学习笔记(一)
- [笔试题 2][c/c++]关于指针直接赋值问题
- 关于C++的子类指针指向父类
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- C++中关于指针的理解(一点一点完善中)
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
- 看完C++中关于指针入门的最好的文章后的随笔
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
- 有关于野指针及其他c++问题小结(一)
- 关于 c/c++ 指针(详细解释)
- C++关于this指针、静态变量和静态成员函数 http://www.cnblogs.com/clrmas/archive/2010/03/23/1692893.htm
- 关于C++中函数指针的使用
- 关于c++中字符串和字符指针之间的转化
- 关于c++悬垂指针的问题
- 关于C++中指针和引用的速度
- 关于C++项目指针对象未被初始化的问题(0xcdcdcd)
- 关于c++在内存布局意义下使用派生类指针访问基类