面试 || 19 C++编译器如何实现的多态
若有子类通过继承,会把父类的内存模型取过来一份,当然也包括虚函数表,并在此内存模型基础上添加子类特有的类成员。
父类的虚函数表是一个结构体,该结构体含有函数指针的数据成员
编译器会为每一个子类生成父类虚函数表的对象
若一个基类有两个子类,则这两个子类的虚函数指针指向的内容是不一样的
虚函数指针指向的函数,参数是一个对象指针(且为void*),在使用时一般是将对象指针退化为uint8。在程序编译执行过程中,会将数据压入栈,因此需通过移动对象指针去访问要访问的内容(这也就是上面两个函数为什么会不一样,注意右侧倒数第二行,那个b是一个代号罢了,叫bb也可以,对应的是c)
汇总:基类指针访问子类对象过程,实际上先把虚函数表取出来,然后再取出来虚函数表的函数指针成员,然后再调用函数指针。
有问题可联系俺哈