读书笔记《深度探索c++对象模型》(4) - 类函数语意
一、类成员函数调用方式 非静态成员函数,要求非静态成员函数应与一般的非成员函数有相同执行效率,本质上,非静态的成员函数会被转为对等的非成员函数的实体( 即:非静态成员函数会被改写,加入 this 指针,并对函数内部的非静态成员变量的存取修改为由 this 指针来存取,最后将该函数重写为一个外部函数进行名称重命名,此时非静态成员函数与非成员函数别无二致了 )。 在非静态成员函数被重写为外部函数时的名称重命名操作,但此操作因不同的编译器实现不同,一般基于类名和函数参数类型、个数等来实现(为区分不同类重名成员变量、重载的非静态成员函数)(重命名操作,其实除了包括成员函数和虚函数外,静态成员函数也会被重命名)。 虚成员函数,因虚函数的存在,类中需增加一个 vptr 的指针,当然该指针名称也会被重命名以满足区分多继承时的多个 vptrs 。当通过对象或指针调用虚函数时,需先获取到虚指针再加上对一个虚函数所在的 slot 索引数字即可,即形如: (*ptr->vptr[someindex])(ptr)。 虚成员函数在通过指针对象调用虚函数和通过类对象调用虚函数的区别,前者可能需要通过(*ptr->vptr[someindex])(ptr)方式来调用,而后者可能直接用重名后的虚函数直接调用即可如:somefunc_XXX(&someobj)而不是(*obj.vptrsomeindex[(&obj