Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75028
  • 博文数量: 15
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-20 19:01
文章分类

全部博文(15)

文章存档

2016年(1)

2015年(1)

2014年(1)

2012年(12)

分类:

2012-09-20 19:36:16

原文地址:虚函数的内存结构 作者:

一、 基本概念

    C++中的虚函数的作用主要是实现了多态的机制。
    关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。
    所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

二、 虚函数的定义与派生类中的重定义

class 类名
{
public:
    virtual 成员函数说明;
}
 
class 类名:访问修饰符 基类名
{
public:
    virtual 成员函数说明;
}

三、 虚函数在内存中的结构

1.我们先看一个例子

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         virtual void fun0() { cout << "A::fun0" << endl; }
  7. };

  8. int main(void)
  9. {
  10.     A a;

  11.     cout << "size of A = " << sizeof(a) << endl;

  12.     return 0;
  13. }
 结果:size of A = 4

2.如果再添加一个虚函数
    virtual void fun1() { cout << "A::fun1" << endl; }

    得到相同的结果。如果去掉函数前面的virtual修饰符 结果:size of A = 1

3.在看下面的结果

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         virtual void fun0() { cout << "A::fun0" << endl; }
  7.     int a;
  8.     int b;
  9. };

  10. int main(void)
  11. {
  12.     A a;

  13.     cout << "size of A = " << sizeof(a) << endl;

  14.     return 0;
  15. }
结果:size of A = 12
在 lip32 平台下指针在内存中占4个字节,虚函数在一个虚函数表(VTABLE)中保存函数地址。


在看下面例子:

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         virtual void fun0() { cout << "A::fun0" << endl; }
  7.         virtual void fun1() { cout << "A::fun1" << endl; }
  8. };

  9. int main(void)
  10. {
  11.     A a;

  12.     cout << "size of A = " << sizeof(a) << endl;

  13.     return 0;
  14. }
结果:
size of A = 4


4.我们再来看看继承中虚函数的内存结构

先看下面的例子

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         virtual void fun0() { cout << "A::fun0" << endl; }
  7. };

  8. class B
  9. {
  10.     public:
  11.         virtual void fun0() { cout << "B::fun0" << endl; }
  12. };

  13. class C
  14. {
  15.     public:
  16.         virtual void fun0() { cout << "C::fun0" << endl; }
  17. };

  18. class D : public A, public B, public C
  19. {};

  20. int main(void)
  21. {
  22.     D d;

  23.     cout << "size of D = " << sizeof(d) << endl;

  24.     return 0;
  25. }
结果:size is = 12


C++ 虚函数表解析
阅读(1055) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~