vlambda博客
学习文章列表

面试 || 19 C++编译器如何实现的多态

对于一个类来说,经过编译器编译,会把程序员写好的代码 TXT 文本编译生成内存模型,内存模型中含有类成员,若类内含有虚函数,则会生成对应的虚函表。

若有子类通过继承,会把父类的内存模型取过来一份,当然也包括虚函数表,并在此内存模型基础上添加子类特有的类成员。

父类的虚函数表是一个结构体,该结构体含有函数指针的数据成员

编译器会为每一个子类生成父类虚函数表的对象

面试 || 19 C++编译器如何实现的多态

若一个基类有两个子类,则这两个子类的虚函数指针指向的内容是不一样的

面试 || 19 C++编译器如何实现的多态

虚函数指针指向的函数,参数是一个对象指针(且为void*),在使用时一般是将对象指针退化为uint8。在程序编译执行过程中,会将数据压入栈,因此需通过移动对象指针去访问要访问的内容(这也就是上面两个函数为什么会不一样,注意右侧倒数第二行,那个b是一个代号罢了,叫bb也可以,对应的是c

汇总:基类指针访问子类对象过程,实际上先把虚函数表取出来,然后再取出来虚函数表的函数指针成员,然后再调用函数指针。

面试 || 19 C++编译器如何实现的多态



 

有问题可联系俺哈