C++中多态(polymorphism)表示以一个public base class 的指针或 reference,寻址出一个derived class object的意思。
继承:
1)它可以继承base class 所声明的 virtual function的函数实体,该函数实体的地址会拷贝到derived class的virtual table相对应的slot中。
2)它可以加入新的virtual function,这时候virtual table 的尺寸会增加一个slot,新的函数实体地址会被放入该slot中。
ptr->z();
其中z()是虚函数,那么什么信息才能让我们在执行期调用正确的z()实体?
1)ptr 所指对象的真实类型,这可使我们选择正确的z()实体;
2)z()实体位置,以便我能够调用它;
那么如何在编译时期设定virtual function 的调用呢?
1)一般而言,并不知道ptr所指的真正类型,但却知道ptr可以存取到该对象的virtual table;
2)虽然不知道哪一个z()函数实体会被调用,但却知道每一个z()函数地址在虚函数表中的slot位置;
这些信息使得编译器可以转化为(*ptr->vptr[4])(ptr); //在slot 4 位置
唯一一个在执行期才能知道的东西是:slot 4所指的到底是哪一个z()函数实体?
一个指向member function的指针:
double(Point::*pmf)();
pmf = &Point::x;
调用它:
(origin.*pmf)();
或
(ptr->*pmf)();
这样操作会被编译器转化为:
(pmf)(&origin);
和
(pmf)(ptr);