c++内存模型四

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值