理论上,C++没有二进制接口,并且vtable中的方法顺序是未定义的.更改类的定义的任何内容,您需要重新编译依赖于它的每个类,在每个dll等.
但我想知道的是编译器如何在实践中工作.我希望他们只是使用在头/类中定义方法的顺序,这将使附加方法更安全.但是他们也可以使用被破坏的名称的哈希来使它们独立,但也完全不可升级.
如果人们具体了解特定编译器的特定版本如何在不同的操作系统等中工作,那么这将是最有帮助的.
补充:理想情况下,将为虚拟方法偏移创建链接器符号,以便永远不会将偏移硬编译到调用函数中.但我的理解是,这从未完成.正确?
在 MSVC 2010 中,它们按照您声明的顺序排列。尽管这是一个任意选择,但我想不出另一个编译器以不同方式执行此操作的任何理由。它只需要保持一致。它们只是指针数组,因此不必担心散列或损坏。
无论顺序如何,派生类中添加的附加虚函数必须位于基类中的虚函数之后,否则多态转换将不起作用。