虚函数表测试代码 帮助理解虚函数表
来源:互联网 发布:js 二维数组初始化为0 编辑:程序博客网 时间:2024/06/08 02:40
#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; }protected:private:};class Base2{public:virtual void f() { cout << "Base2::f()" << endl; }virtual void g() { cout << "Base2::g()" << endl; }virtual void h() { cout << "Base2::h()" << endl; }protected:private:};//无覆盖,这样的话,虚函数就在原来的虚函数表后面追加就行了 class Derived :public Base{public:virtual void f1() { cout << "Derived::f1()" << endl; }virtual void g1() { cout << "Derived::g1()" << endl; }virtual void h1() { cout << "Derived::h1()" << endl; }};//有覆盖,这样的话相同的函数给覆盖掉 class Derived_cover :public Base{public:virtual void f() { cout << "Derived_cover::f()" << endl; }virtual void g1() { cout << "Derived_cover::g1()" << endl; }virtual void h1() { cout << "Derived_cover::h1()" << endl; }};//多重继承,无覆盖 class multipleDerived :public Base, public Base2{public:virtual void f1() { cout << "multipleDerived::f1()" << endl; }virtual void g1() { cout << "multipleDerived::g1()" << endl; }};//多重继承,有覆盖 class multipleDerivedCover :public Base, public Base2{public:virtual void f() { cout << "multipleDerivedCover::f()" << endl; }virtual void g1() { cout << "multipleDerivedCover::g1()" << endl; }};typedef void(*fun)(void);//测试虚函数与虚函数表的存放关系 void test1(){Base b;fun pfun = NULL;cout << "虚函数表地址" << (int*)*(int*)(&b) << endl;cout << "虚函数表 第一个函数地址" << (int*)*(int*)*(int*)(&b) << endl;cout << "虚函数表 第二个函数地址" << (int*)*((int*)*(int*)(&b) + 1) << endl;cout << "虚函数表 第三个函数地址" << (int*)*((int*)*(int*)(&b) + 2) << endl;//通过指针直接访问虚函数表里面函数的内容 pfun = (fun)(int*)*(int*)*(int*)(&b);pfun();pfun = (fun)(int*)*((int*)*(int*)(&b) + 1);pfun();pfun = (fun)(int*)*((int*)*(int*)(&b) + 2);pfun();}//测试没有函数覆盖的情况,直接在原来的虚函数表后面追加 void test2(){Base b;Derived derive;fun pfun = NULL;cout << "虚函数表地址" << (int*)*(int*)(&b) << endl;cout << "虚函数表地址" << (int*)*(int*)(&derive) << endl;cout << "虚函数表 第一个函数地址" << (int*)*(int*)*(int*)(&b) << endl;cout << "虚函数表 第一个函数地址" << (int*)*(int*)*(int*)(&derive) << endl;cout << "虚函数表 第二个函数地址" << (int*)*((int*)*(int*)(&b) + 1) << endl;cout << "虚函数表 第二个函数地址" << (int*)*((int*)*(int*)(&derive) + 1) << endl;cout << "虚函数表 第三个函数地址" << (int*)*((int*)*(int*)(&b) + 2) << endl;cout << "虚函数表 第三个函数地址" << (int*)*((int*)*(int*)(&derive) + 2) << endl;//打印出虚函数内容 pfun = (fun)(int*)*(int*)*(int*)(&derive);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 1);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 2);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 3);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 4);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 5);pfun();}//有覆盖的情况,直接将原来的函数覆盖掉就行了 void test3(){Base b;Derived_cover derive;fun pfun = NULL;cout << "虚函数表地址" << (int*)*(int*)(&b) << endl;cout << "虚函数表地址" << (int*)*(int*)(&derive) << endl;cout << "虚函数表 第一个函数地址" << (int*)*(int*)*(int*)(&b) << endl;cout << "虚函数表 第一个函数地址" << (int*)*(int*)*(int*)(&derive) << endl;cout << "虚函数表 第二个函数地址" << (int*)*((int*)*(int*)(&b) + 1) << endl;cout << "虚函数表 第二个函数地址" << (int*)*((int*)*(int*)(&derive) + 1) << endl;cout << "虚函数表 第三个函数地址" << (int*)*((int*)*(int*)(&b) + 2) << endl;cout << "虚函数表 第三个函数地址" << (int*)*((int*)*(int*)(&derive) + 2) << endl;//打印出虚函数内容 pfun = (fun)(int*)*(int*)*(int*)(&derive);//f将父类的f覆盖掉 pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 1);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 2);pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 3);// pfun();pfun = (fun)(int*)*((int*)*(int*)(&derive) + 4);pfun();cout << "直接通过父类指针调用子类实现的函数的话" << endl;Base* newBase = new Derived_cover;newBase->f();newBase->g();newBase->h();}//测试多重继承的情况,测试一下多重继承的虚函数表的内存分布,应该是有两个虚函数表, //分别指向base,base2,无覆盖 void test4(){cout << "多重继承的内存分布" << endl;multipleDerived myMultiple;fun pfun = NULL;cout << "多重继承的虚函数1地址" << (int*)*(int*)(&myMultiple) << endl;cout << "多重继承的虚函数2地址" << (int*)*((int*)(&myMultiple) + 1) << endl;cout << "虚函数表1应该是Base函数+子类未被覆盖的函数" << endl;pfun = (fun)(int*)*(int*)*(int*)(&myMultiple);//vp1的fun1 base::f() pfun();pfun = (fun)(int*)*((int*)*(int*)(&myMultiple) + 1);//vp1的fun2 base::g() pfun();pfun = (fun)(int*)*((int*)*(int*)(&myMultiple) + 2);//vp1的fun3 base::h() pfun();pfun = (fun)(int*)*((int*)*(int*)(&myMultiple) + 3);//vp1的fun4 multipleDerived::f1() pfun();pfun = (fun)(int*)*((int*)*(int*)(&myMultiple) + 4);//vp1的fun4 multipleDerived::g1() pfun();cout << "虚函数表2" << endl;pfun = (fun)(int*)*(int*)*((int*)(&myMultiple) + 1);pfun();pfun = (fun)(int*)*((int*)*((int*)(&myMultiple) + 1) + 1);pfun();}//测试多重继承有覆盖 void test5(){cout << "多重继承有覆盖" << endl;multipleDerivedCover d;Base* d1 = &d;Base2* d2 = &d;d1->f();d2->f();d1->g();d2->g();}int main(){test1();test2();test3();test4();test5();return 0;}
0 0
- 虚函数表测试代码 帮助理解虚函数表
- 理解虚函数表
- 深入理解虚函数表
- C++虚函数表理解
- 深入理解虚函数表
- 通过代码理解C++虚函数表和多态的实现
- 深入理解C++虚函数表
- 虚函数表理解(转载)
- C++虚函数表一点理解
- 微软对于虚函数的帮助
- 测试C++中的虚函数表
- 虚函数表的测试小demo
- 效率测试函数代码
- 虚函数的理解
- 虚函数的理解
- C++ 虚函数理解
- C++ 虚函数理解
- 虚函数理解
- "Check Android SDK" has encountered a problem
- [Servlet&JSP] 封装器的使用
- VS编译问题“fatal error C1859 意外的预编译头错误,只需重新运行编译器”
- Nim Game 的解决
- [caffe]大体介绍
- 虚函数表测试代码 帮助理解虚函数表
- jquery validate
- 3156: 防御准备
- 深入探究Swift数组背后的协议、方法、拓展
- socketpair理解
- POJ2362 DFS+剪枝
- 智力拼图问题–关于回溯和并行:单线到多线程再到GPU编程的进阶(一)
- Linux_NFS/Samba服务器
- poj1251