我对 vtables 的理解是,如果我有一个带有虚函数 speak() 以及子类 Lion 和 HouseCat 的类 Cat,那么就会有一个 vtable 将 speak() 映射到每个子类的正确实现。于是打了个电话
cat.speak()
编译为
cat.vtable[0]()
即在 vtable 位置 0 中查找并在该位置调用函数指针。
我的问题是:多重继承会发生什么?
让我们添加一个类 Pet。Pet 有虚函数 speak() 和 eat()。HouseCat 扩展了 Pet,而 Lion 没有。现在,我需要确保
pet.eat()
编译为
pet.vtable[1]()
也就是说 vtable[0] 需要是 speak()。Pet.eat 需要是 slot 1。那是因为 cat.speak() 需要访问 vtable 中的 slot 0,如果对于 HouseCat,slot 0 恰好是eat,这将出现可怕的错误。
编译器如何确保 vtable 索引组合在一起?