C++多重继承无虚函数覆盖的虚函数表

2470阅读 0评论2013-07-30 梦醒潇湘love
分类:C/C++


    在网上查找关于虚函数的资料时,看到了这样一部分内容,记录下来,感谢原作者。
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;

  4. class Base1
  5. {
  6. public:
  7.     //虚函数定义
  8.     virtual void f(){cout << "Base1::f" << endl;}
  9.     virtual void g(){cout << "Base1::g" << endl;}
  10.     virtual void h(){cout << "Base1::h" << endl;}
  11. };

  12. class Base2
  13. {
  14. public:
  15.     //虚函数定义
  16.     virtual void f(){cout << "Base2::f" << endl;}
  17.     virtual void g(){cout << "Base2::g" << endl;}
  18.     virtual void h(){cout << "Base2::h" << endl;}
  19. };

  20. class Base3
  21. {
  22. public:
  23.     virtual void f(){cout << "Base3::f" << endl;}
  24.     virtual void g(){cout << "Base3::g" << endl;}
  25.     virtual void h(){cout << "Base3::h" << endl;}
  26. };

  27. //多继承的情况——无虚继承覆盖
  28. class Derive:public Base1, public Base2, public Base3
  29. {
  30. public:
  31.     //虚函数定义
  32.     virtual void f1(){cout << "Derive::f1" << endl;}
  33.     virtual void g1(){cout << "Derive::g1" << endl;}
  34. };

  35. int main()
  36. {
  37.     typedef void (*fun)(void);

  38.     cout << "多重继承时的情况(无虚函数覆盖):" << endl;
  39.     Derive dobj;
  40.     cout << "Derive类的第一个虚函数表地址:" << (int *)(&dobj) << endl;
  41.     cout << "依次调用三个虚函数表中的虚函数:" << endl;
  42.     cout << "第一个虚函数表中的虚函数:" << endl;
  43.     fun pfun = NULL;
  44.     pfun = (fun)*( (int *)*( (int *)(&dobj) ) );
  45.     pfun();
  46.     pfun = (fun)*( (int *)*( (int *)(&dobj) ) + 1);
  47.     pfun();
  48.     pfun = (fun)*( (int *)*( (int *)(&dobj) ) + 2);
  49.     pfun();
  50.     pfun = (fun)*( (int *)*( (int*)(&dobj) ) + 3);
  51.     pfun();
  52.     pfun = (fun)*( (int *)*( (int*)(&dobj) ) + 4);
  53.     pfun();
  54.     //
  55.     cout << "第二个虚函数表中的虚函数:" << endl;
  56.     pfun = (fun)*((int *)*((int*)(&dobj)+ 1));
  57.     pfun();
  58.     pfun = (fun)*((int *)*((int*)(&dobj)+ 1) + 1);
  59.     pfun();
  60.     pfun = (fun)*((int *)*((int*)(&dobj)+ 1) + 2);
  61.     pfun();
  62.     //
  63.     cout << "第三个虚函数表中的虚函数:" << endl;
  64.     pfun = (fun)*((int *)*((int*)(&dobj )+ 2));
  65.     pfun();
  66.     pfun = (fun)*((int *)*((int*)(&dobj )+ 2) + 1);
  67.     pfun();
  68.     pfun = (fun)*((int *)*((int*)(&dobj )+ 2) + 2);
  69.     pfun();

  70.     return 0;
  71. }
    运行结果如下所示。
    

    上面代码的类继承关系如下所示(多重继承无虚函数覆盖)。
    
    子类虚函数表的结构如下所示。
       

    上面的程序就是验证多重继承无虚函数覆盖时,子类的对象模型。



上一篇:sigwait函数
下一篇:数据结构之最短路径(DijKstra)