笔者校招面试时被问到了著名问题「C++ 与 Java 如何实现多态」,然后不幸翻车。运行以下代码能够确认 Parent1 和 Child 对象的真实数据结构大小都是 8 字节,也即只有虚函数列表指针。这个值也即相应类的虚函数表地址。有一个非常有意思的问题:C++ 发生多重继承时,如何支持多态。比如,Child 类继承了 Parent1, Parent2 两个类,则在 Child 指针转换为 Parent1 指针时,不对指针的值进行调整,因为 Parent1 是 Child 的第一个父类。这都是不可接受的,因此虚函数列表仍然有必要。Java 不支持多重继承,但 Java 支持接口 Interface, 接口跟多重继承有相似之处,不能简单的使用一个虚函数表查找。Java 相对于 C++ 是更加「强类型」的语言。

C++中的多态与多重继承实现与Java的区别

C++中的多态与多重继承实现与Java的区别

C++中的多态与多重继承实现与Java的区别