首页 > 编程语言 > 详细

深度探索C++对象模型 个人总结 第四章 Function语意学

时间:2020-12-26 00:13:47      阅读:27      评论:0      收藏:0      [点我收藏+]

Function语意学

static member functions不能直接存取nonstatic数据,不能被声明为const

 

4.1Member的各种调用方式

Nonstatic Member Functions(非静态成员函数)

nonstatic member function至少必须和一般的nonmember function有相同的效率,这是因为编译器内部已将”member函数实例“转换为对等的”nonmember函数实例“

转换步骤:

  1.改写函数的signature(译注:意指函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class object得以将此函数调用。该额外参数被称为this指针

  2.将每一个”对nonstatic data member的存取操作“改为经由this指针来存取

  3.将member function重新写成一个外部函数。将函数名称经过”mangling“处理,使它在程序中成为独一无二的词汇

 

名称的特殊处理(Name Mangling)

member的名称前面加上class名称,再加上它们的参数链表(可以从函数原型参考得到),制造出独一无二的结果

 

Virtual Member Functions(虚拟成员函数)

virtual member function的调用会被转化为对编译期产生的指向virtual table的指针vptr的访问;并通过索引确定virtual table slot的位置;和非静态成员函数类似,也为其安插一个this指针

 

Static Member Functions(静态成员函数)

在引入static member functions之前使用

((class*)0)->member function();//将0强制转换为一个class指针,因而提供一个this指针实例

 

Static member functions的主要特性就是它没有this指针,下面的特性都是根源于其主要特性:

  1.它不能够直接存取其class中的nonstatic members

  2.它不能够被声明为const,volatile,virtual

  3.不需要经由class object才被调用

 

foo().static_member_function();
//会被转换为

(void)foo();//仍需要评估求值 class::static_member_function();

 

取一个static member function的地址,指针类型是”nonmember函数指针“

 

4.2Virtual Member Functions(虚拟成员函数)

多态(Polymorphism)表示”以一个public base class的指针(或reference),寻址出一个derived class object“的意思

识别一个class是否支持多态,唯一适当的方法就是看它是否有任何virtual function。只要class拥有一个virtual function,它就需要一份额外的执行期信息(runtime type identification)

 

在执行期调用正确的virtual function实例,需要知道:

  1.ptr所指对象的真实类型。这可使我们选择正确的virtual function实例(一个字符串或数字,表示class的类型)

  2.virtual function实例的位置,以便能够调用它(一个指针,指向某表格,表格中持有程序的virtual functions的执行期地址,地址和地址指向的表格在执行期都是固定不变的)

 

为了找到函数地址,每个virtual function被指派一个表格索引值

一个class只会有一个virtual table。每一个table内含其对应之class object中所有active virtual functions函数实例的地址:

  1.这一class所定义的函数实例。它会改写一个可能存在的base class virtual function函数实例

  2.继承自base class的函数实例。这是在derived class决定不改写virtual function时才会出现的情况

  3.一个pure_virtual_called()函数实例,它既可以扮演pure virtual function的空间保卫者角色,也可以当作执行期异常处理函数

单一继承

单一继承的三种可能性:

  1. 将base class virtual table中的地址拷贝到derived class virtual table的相对应slot之中
  2. 可以使用自己的函数实例(被放到对应slot之中)
  3. 可以加入新的virtual function, 就增加virtual table尺寸, 新的函数实例地址被放入该slot之中

从上面可以看到, 单继承下的虚函数效率高, 实现简单, 但是多继承和虚拟继承则要复杂很多

深度探索C++对象模型 个人总结 第四章 Function语意学

原文:https://www.cnblogs.com/GodZhuan/p/14191160.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!