虚表的细节
2021年5月29日
9:23
对于同一类对象,无论实例化了多少个对象,都只会创建一张虚表!
所以比如cat类,如果我实例化了两个多个cat,他们虚表放的东西都是一样的!
但是放虚表的空间地址不一样。
=====================================================
一般的面向对象来说,如果子类重写的函数中没有父类的函数,调用时会先查找子类是否拥有该函数,如果没有,就会去父类中查找该函数!
but:
如果cat只重写了一个函数,
仍然会创建一个虚表,在虚表内把要调用的函数地址放好,
调用时一步到位直接调用!
===================================================
只要函数里面有虚函数,都一定会搞虚表!即便是父类也会在最前面四个字节创建虚表,一旦有虚函数,一视同仁
表面上可能没必要,但是长远来看是很有必要的,因为你搞虚函数,就意味着你将来有子类存在。
============================================================
只要父类是虚表,那么继承父类的子类的子类的子类的子类的子类,都是虚表!
因为继承会把所有的所有的继承下来
这个whiteCat 的虚表放置的是 animal里面的run 和 cat 里面的speak
因为找不到调用一般是上一级查找!