Function语意学---Chapter4

  • name mangling(名称的特殊处理)
  • static member function
  1. 没有this指针
  2. 不能直接存取class中的nonstatic member
  3. 不能被声明为const、volatile或virtual
  4. 不需要经由class object才被调用---虽然大部分时候是被这样调用的
  5. 取static member function的地址,获得的是其在内存中的位置,由于static member function没有this指针,所以其
    地址类型为nonmember函数指针,而不是一个指向class member function的指针
  • virtual member functions 虚拟成员函数
  1. 在C++中, 多态表示以一个public base class 的指针(或reference),寻址出一个derived class object的意思。
Point *ptr = new Point2d;
  1. 识别一个class是否支持多态,唯一适当的方法就是看看它是否有任何的virtual function,只要class拥有一个virtual function,它就需要这份额外的执行期信息。
  2. vbtl中slot从1开始

4. 一个class只会有一个virtual table,其中内含对应class object中所有的active virtual functions的函数实体的地址。这些active virtual functions包括:

  • 一个class定义的函数实体。它会改写overriding一个可能存在的base class virtual function。

  • 继承自base class的函数实体。此时该class不改写base class virtual function。

  • 一个pure_virtual_called()函数实体,它既可以扮演pure virtual function的空间保卫者,也可以当作执行期异常处理函数。如果该函数被调用,通常的操作是结束程序。

  1. 每一个virtual function都被指派一个固定不变的索引值,该值在整个继承体系中保持与特定virtual function的关联。这样就可以在编译时期设定virtual function的调用。

  2. 多重继承下,一个上层basse classes数目为n的derived class,它将内含n-1个额外的virtual tables。其主要实体与最左端的base class共享,其中包含所有virtual functios的地址;n-1个次要实体与其它base classes有关,其中只包含出现在对应base class中virtual functions的地址。

  3. 在多重继承中支持virtual function,其复杂度围绕在第二个及后继base class上,以及执行期this指针调整上。第二(或后继)base class会影响对virtual function支持的3种情况:

  • 通过指向第二个base class的指针,调用derived class virtual function;
  • 通过指向derived class的指针,调用第二个base class中一个继承而来的virtual function;
  • 允许virtual function函数的返回值类型有所变化,可能是base type,也可能是publicly derived type。
  1. 关于执行期this指针调整比较有效率的解决方法是thunk。所谓thunk是一小端assembly码,用来以适当的offset值来调整this指针并跳到相应的virtual function。thunk技术允许virtual table slot继续内含一个简单的指针,此时多重继承将不需要任何空间上的额外负担!slots中的地址可以直接指向virtual function,也可以指向一个相关的thunk。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Introduction to C++ (Season 1) Unit 1: Overview of C++ 第1...
    我是阿喵酱阅读 2,770评论 0 7
  • 1.C和C++的区别?C++的特性?面向对象编程的好处? 答:c++在c的基础上增添类,C是一个结构化语言,它的重...
    杰伦哎呦哎呦阅读 9,676评论 0 45
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 亲爱的月亮,我们天上见 水映孤独的纸船,我在江湖之远 既深不可测,又梦中织茧 让我们躲进某个璀璨的瓶中吧 点灯的人...
    独孤千雪阅读 327评论 3 8
  • 题图七绝 清肌柔蔓溢流霞,(平平平仄仄平平) 娇媚缤纷湿露华,(平仄平平平仄平) 中有孤枝颜似雪,(平仄平平平仄仄...
    妮子_aacf阅读 426评论 0 4