虚函数表测试代码 帮助理解虚函数表

来源:互联网 发布: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
原创粉丝点击