Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2109084
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-07-30 16:33:30


    在网上查找关于虚函数的资料时,看到了这样一部分内容,记录下来,感谢原作者。
  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. }
    运行结果如下所示。
    

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

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



阅读(2402) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~