Member 的调用方式
1.Nonstatic Member Functions (非静态成员函数)
member function被内化为nonmember的形式,转化步骤如下:
(1)改写函数的signature以安插一个额外的参数到member function中,用以提供一个存取管道,使class得以调用该函数。该额外参数被称为this指针;
(2)将每个“对nonstatic data member的存取操作”改为经由this指针存取;
(3)将member function重新写成一个外部函数,对函数名称进行mangling处理,使它在程序中成为独一无二的词汇。
名称的特殊处理:加上class名称,参数,参数类型。
2. Static Member Functions (静态成员函数)
Point3d::normalize() 是一个static member function,以下调用操作:
obj.normalize();
ptr->normalize();
将被转换为一般的nonmember函数调用。
Static member functions的主要特性是没有this指针:
(1)它不能够直接存取class中的nonstatic members;
(2)它不能够被声明为const、volatile、或virtual;
(3)它不需要经由class object才被调用。
C++中,多态表示以一个public base class的指针或引用,寻址出一个derived class object的意思
一个class只会有一个virtual table。每一个table内含其对应的class object中所有active virtual functions函数实体的地址。这些active virtual functions包括:
(1)这个class所定义的函数实体,它会改写一个可能存在的base class virtual function函数实体;
(2)继承自base class的函数实体。这是在derived class决定不改写virtual function时才会出现的情况。
(3)一个pure_virtual_called()函数实体,既可以扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。
支持指向virtual member functions的指针
float (Point::*pmf) () = &Point::z;
Point* ptr = new Point3d;
pmf一个指向member function的指针,被设值为Point::z()(一个virtual function)地址。
ptr->z(); 调用的是Point3d::z()。
(ptr->*pmf)(); 调用的也是Point3d::z() ,即虚拟机制仍然能够在使用“指向member function之指针”的情况下运行。
对一个nonstatic member function取地址,将获得该函数在内存中的地址,而对一个virtual function取地址,所能够获得的只是一个索引值。