虚函数的内存结构

虚函数的内存结构
虚函数的内存结构

一、 基本概念

    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++ 虚函数表解析 

此文章转自http://blog.chinaunix.net/uid-26495963-id-3343900.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值