Member的各种调用方式:
Nonstatic Member Function
实际上Members functions被内化为nonmember的形式:
1. 改写函数以安插一个额外的参数到Members functions中,用以提供一个存取管道,使class Object得以将此函数调用,该额外参数称为this指针。
2.将每一个对nonstatic data member的存取操作改为经由this指针来存取
3.将member function重新写成一个外部函数,将函数名称经过mangling处理,使它在程序中成为独一无二的语汇。
Virtual Member functions:
*ptr->vptr[1](ptr)相当于this指针 ptr
经由一个class object调用一个virtual function,这种操作应该总是被编译器像对待一般nonstatic member function一样加以决议。
Static member function:
它不能够直接存取class中的nonstatic members
它不能够被声明为const volatile 或virtual
它不需要经由class object才被调用。
如果取一个其地址,获得的将是其在内存中的位置,也就是其地址。由于其没有this指针。所以地址类型并不是一个指向class member function的指针,而是一个nonmember函数指针。
Virtual Member Function:
一个class只会有一个virtual table。每一个table内含其对应之class object中所有active virtual function的地址中激活virtual function.其中包括:
要重写的函数。
继承自base class的函数实例
一个pure_virtual_called()函数,它既可以扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。如果该函数以外被调用,通常是结束这个程序。
多重继承下的virtual functions:
在多重继承下,一个derived class 内涵n-1个额外的virtual tables。针对每一个virtual tables,derived对象有对应的vptr.
允许虚函数的返回类型不同
Base2*pb1=new derived;
Base2*pb2=pb1->clone();会有一个类型转换把pb1->clone转换为base2;
指向Member function的指针:
对nonstatic 如果该函数不是虚函数,得到的是它在内存中真正的地址。它也需要绑定到对象地址上。
Double (point::*cord)()=&point::x;
调用:orgin.*cord();转换为(cord)(&orgin);其作用是this指针。
虚函数:所知道的仅是虚函数在虚表中的索引值。真实地址在编译期是未知的。
多重继承下:结构体存有索引和非虚函数地址offset;
内敛函数:
有局部变量放在一个封闭区段中,有副作用就是不能直接一一封塞程序中的每一个形式参数。一个常量表达式在替换之前先完成其求值操作。