• 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分开了,其实他们是在一起的,前面之所                 以分开说,是为了叙说方便。

  • 相关阅读:
    java 放射机制简介
    java 放射机制简介
    后海日记(1)
    后海日记(1)
    java 发邮件 代码
    java 发邮件 代码
    hadoop学习笔记411
    hadoop学习笔记411
    swoole_table
    用swoole简单实现MySQL连接池
  • 原文地址:https://www.cnblogs.com/stemon/p/3407191.html
Copyright © 2020-2023  润新知