基本知识
上述代码阐述的是一种 动态多态,其中的Animal &animal 是运用了 父类的引用或者指针 可以直接指向 子类对象。
若不加 virtual ,则地址会进行早绑定,无论父类的指针指向什么,进行的都是animal.speak()。
若加了virtual,则起到了晚绑定的作用,若dospeak(cat),则进行的是cat.speak()的操作。
底层原理
在类Animal的内部,存在 vfptr 指针,指向一个 vftable-虚函数(表),虚函数(表)中记录的是这个虚函数的地址
注 : v-virtual, f-function,ptr-pointer
若如上述代码用 Cat 子类来继承 父类 Animal,子在子类中 也有一个vfptr指向 vftable-虚函数(表),子类的虚函数(表)中记录的是子类的虚函数的地址。
若在子类中 重写了 父类的虚函数(表)中 的 父类的虚函数的地址 会被替换成 子类中 虚函数 的地址,这就达到了 多态 的 效果