标签:c style class blog a http
C++支持三种类型的member
functions: static、nonstatic和virtual,每一种类型调用方式都不相同。
一 nostatic members functions
1 调用方式
C++的设计原则之一就是:nonstatic member
function知识和一般的nonmember function有相同的效率。因此:
nonstatic
member function被编译器内化为nonmember function的形式,且含有一个this(A *const
this)指针成员。
转化步骤如下:
① 改写函数的signature以安插一个额外的参数到member function,该参数即 this指针。
non-const nonstatic member增加:A
*const this; const nonstatic member增加: const
A *const this.
② 将每一个“对nonstatic data member的存取操作”改为经由this指针来存取。
③ 将member function重写成一个外部函数,对函数名称进行“name-mangling"处理,使它在程序中称为独一无二的词汇。
2 指向这类成员函数的指针
取一个nonstatic member
function的地址,如果该函数是nonvirtual,得到的结果是它在内存中真正的地址,然而这个值也是不完全,它也需要被绑定于某个class
object地址上,才能够通过它调用该函数。所有的nonstatic member function
都需要对象的地址(以参数this 指出)。
二 static member function
1 调用方式
static
member function被编译器转化为nonmember function的形式,且不含this指针成员。
static member function的主要特性就是它没有this指针,以下的次要特性统统根源与其主要特性:
① 它不能直接存取其class中nonstatic members
② 它不能被声明为const,volatile或virtual。
③ 它不需要经由class object才能调用--虽然大部分时候它是这样调用的。
2 指向这类成员函数的指针
取一个static
member function地址,获得的将是其在内存中的位置,也就是地址。由于没有this指针,所以其地址的类型并不是一个指向”class member
function “ 指针,而是一个”nonmember“
函数指针。
三 virtual member functions
调用方式:
1 virtual function的一般实现模型:① 每一个class有一个virtual table,内涵该class 之中有作用的virtual
function的地址,②然后每个object有一个vptr,指向virtual table的所在。
2 ptr->z(); z()是虚函数,我们在执行期需要知道:
① ptr所指对象的真实类型,这可使我们选择正确的z()实体。(表示类型信息的字符串或数字)
② z()实体位置,以便我们能够调用它。通过虚函数指针(指向虚函数表)+该函数表格索引值。
3 virtual table中虚函数地址如何构建起来。
在C++中,虚函数地址可以在编译时期获得,此外,这一组地址是固定不变的,执行期不可能新增或替换之。由于程序执行时,表格的大小和内容都不会改变,所以其建构和存取皆可以有编译器完全掌握,不需要执行期任何接入。
4 执行期如何找到编译器备妥的那些虚函数的地址?
① 为了找到表格,每一个class object
被安插一个有编译器内部产生的指针(vptr虚函数表指针),指向表格。
② 为了找到函数地址,每一个虚函数被指配一个表格索引值。
这些工作都由编译器完成,执行期要做的,只是在特定的virtual table
slot(记录着virtual function的地址)中激活virtual function。
ptr->z();被转换为:
(*ptr->vptr[4])(ptr);
5 多重继承下的virtual function
在多重继承下,虚函数复杂度围绕在第二个及后继的base
classes身上,以及必须在执行期调整this指针这一点。
6 虚拟继承下的virtual function
2 指向这类成员函数的指针
①对一个虚函数,其地址在编译时期是未知的,所能知道的仅是虚函数在其相关之虚函数表中的索引值。也就是说,对一个virtual
member function 取地址,所获得的只是一个索引值。
②多重继承下,指向member function的指针
为了让指向member
function的指针也能支持多重继承和虚拟继承,专家设计了下面一个结构体:
struct
_mptr{
int
delta;//增量,多重继承下调整this指针用
int
index;//虚函数表中某个虚函数的索引值
union{
ptrtofunc faddr;//nonvirtual member
function地址
int
v_offset;//一个virtual(或多重继承中的第二或后继的)base
class的vptr的位置。
};
};
Function 语意学,布布扣,bubuko.com
Function 语意学
标签:c style class blog a http
原文地址:http://www.cnblogs.com/botou0405/p/3764691.html