c++内存模型四

来源:互联网 发布:md204l编程软件 编辑:程序博客网 时间:2024/05/17 23:42

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);

0 0
原创粉丝点击