C++虚函数在内存中的实现

首先来一张图,一目了然:

C++虚函数在内存中的实现

然后把相应的代码贴上来:

 1 class A
 2 {
 3     int a;
 4 
 5 public:
 6     virtual void f();
 7     virtual void g(int);
 8     virtual void h(double);
 9 };
10 
11 class B : public A
12 {
13 public:
14     int b;
15 
16     void g(int);    //overrides A::g()
17     virtual void m(B*);
18 };
19 
20 class C : public B
21 {
22 public:
23     int c;
24 
25     void h(double);    //overrides A::h()
26     virtual void n(C*);
27 };

 后记:(1)每个类的一开始都是一个虚函数指针,这个指针指向一个虚函数表,表中的每一项都是相应的虚函数的指针。

         (2)类在继承的时候,一个子类的开始就是基类的部分,了解继承后子类的模型。

         (3)vfptr这个指针有范围的,比如A类的vfptr只能看三个记录,B的vfptr能看四个记录,C的vfpr能看五个记录。这就是多态的时候,父类的指针                 指向子类对象的时候,它看不到子类的数据成员和成员函数(包括子类中的虚函数)。

         (4)一般的面向对象的语言多态基本都是这个原理,前面写了一篇博文,当时说的是基类和派生类的vfptr分开了,其实他们是在一起的,前面之所                 以分开说,是为了叙说方便。