(1)编译器会为每个包含虚函数的类构建一个虚函数表vptable,这个表中存放该类对象会调用到的虚函数地址。
(2)当含有虚函数的类创建对象时,编译器会在对象的地址首位置插入指向该虚函数的指针vptr。
(3)如果传递给父类指针的是子类对象地址,那么在调用虚函数时,是通过子类对象的首地址(也是vptr的位置)来找到子类的虚函数表。
(4)如果子类重写了父类的虚函数,在虚函数表的相应位置,指向的是重写后的虚函数地址。
调用它,从而实现了多态。上述四个前提条件,保证了多态机制。
C++是支持多重继承的。
如果子类继承了多个父类,那么如何实现多态呢?
1)该子类有多个虚函数表;
2)由该类创建的对象,在其首地址位置下面有多个虚函数表指针,排列顺序是与继承顺序相一致;
3)当把子类对象传递给父类的指针时,编译器会根据对应的虚函数表指针来访问虚函数表,从而找到将要调用的虚函数地址。