2024/6/27
多态
多态意味着相同的消息给予不同的对象会引发不同的动作。多态利用虚函数来实现。虚函数就是在函数前面加关键字virtual。父类中写虚函数,子类重写父类的虚函数,那么,当父类指针指向子类对象时,父类对象调用虚函数就调用的是子类的虚函数,而不是父类自己的虚函数。从而实现多态。
例子:查看类的内存分布,以及是如何实现多态的
主函数
Father类内存分布
查看父类的内存分布可以看见,父类中有一个vfptr,这个vfptr就是虚函数表指针,我的为x64,所有它为8字节,它指向虚函数表。这个虚函数表就是由父类定义的3个虚函数构成的。
Son类内存分布
同样,子类继承父类,也有一个虚函数表指针指向虚函数表
子类中重写父类的fun1函数,所有,在子类中父类的fun1就变成了子类的fun1。而且子类也有自己定义的虚函数fun5。
多态的实现
父类的指针指向子类的对象,那么,当父类指针对象调用fun1时,就会调用它指向子类的fun1。从而实现多态效果。
主函数运行结果
遇到的问题及解决方法
解决方法
由于我现在的vs,是使用了64位平台。64位平台,一个指针8个字节,需要把vptr变量的int改成long long , 而int适用于x86平台而不适用64平台。所有将int改为long long,就把问题解决了。具体如何修改请看上面的主函数图片。