本质是:对象中指向VirtualTable的指针是否发生变化
VirtualTable是在编译阶段生成的,该指针初始化时指向对象所实现的类的VirtualTable。
Base基类,Derived派生类
void fun(Base a); 将Derived b传入时,首先发生了b的向上转型,然后发生了值拷贝,vptr发生了改变,多态失败。
void fun(Base* a) 将Derived * b传入时,发生b的向上转型和拷贝,但是地址变量的转型和拷贝不改变vptr的指向,vptr指向得以保留,多态成功。
参考: