多态实现的机制(自我总结,可能不够准确,待完善)
假如存在如下的类定义:
class Base { virtual void VirtualFun() { } }; class Derived : public Base { virtual void VirtualFun() { } };
对于Base *p = new Derived();来说,等号右边是创建子类的操作:
它会先执行父类的构造函数,初始化虚表指针去指向父类的虚表,此时虚表中存放的是父类中的虚函数.
然后再去执行子类的构造函数,初始化它的虚表指针,也就是父类的虚表指针,如果子类重写了父类的虚函数,则会在虚表对应的位置去覆盖父类原有的虚函数.
赋值给p的操作表示了,用p指向子类对象的起始位置.此时p->VirtualFun,即为p->vfptr->VirtualFun,指向了子类的虚函数.
新战场:https://blog.csdn.net/Stephen___Qin