假如存在如下的类定义:

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

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

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

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

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

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