原文章链接是:http://blog.csdn.net/haoel/article/details/1948051
讲的很生动,但是有些小问题,评论里面有些说的非常详细。实验一把
- 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;
- }