多态实现的机制(自我总结,可能不够准确,待完善)

假如存在如下的类定义:

class Base
{
   virtual void VirtualFun()
{
} 
};

class Derived : public Base
{
virtual void VirtualFun()
{
}
};

对于Base *p = new Derived();来说,等号右边是创建子类的操作:

  它会先执行父类的构造函数,初始化虚表指针去指向父类的虚表,此时虚表中存放的是父类中的虚函数.

  然后再去执行子类的构造函数,初始化它的虚表指针,也就是父类的虚表指针,如果子类重写了父类的虚函数,则会在虚表对应的位置去覆盖父类原有的虚函数.

赋值给p的操作表示了,用p指向子类对象的起始位置.此时p->VirtualFun,即为p->vfptr->VirtualFun,指向了子类的虚函数.

posted @ 2020-05-06 10:38  心媛意码  阅读(142)  评论(0编辑  收藏  举报