我的理解是,如果我有一个类Cat,并且这个类有一个虚函数speak(),然后分别有Lion和HouseCat两个子类,那么就会有一个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索引匹配?
eat
不一定必须在位置1。Pet
可以有一个指定{eat, speak}
的vtable,而Cat
则保留一个指定{speak}
的vtable。 - aschepler