现在的位置: 首页 > 编程语言 > 正文

虚函数的内存结构

2019年03月30日 编程语言 ⁄ 共 1676字 ⁄ 字号 评论关闭
虚函数的内存结构
虚函数的内存结构

一、 基本概念

    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

抱歉!评论已关闭.