我最近对 C++ 虚拟表有疑问。
为什么 C++ 使用虚拟表?
=>因为C++编译器不知道实际的函数地址
--->为什么?
=>因为 C++ 编译器不知道指针“panimal”指向的对象的确切类型(猫?狗?动物?)
- -为什么?这是编译器可以找出对象类型的任何方式吗?
=>是的,我认为编译器可以通过跟踪对象类型来实现。
让我们考虑一下对象指针获取其值的来源。确实有2个来源。
- 另一个指针
- 类实例的地址“另一个指针”在哪里获得它的值?最终,有一个指针从“类实例”中获取它的值。
因此,通过将分配线程向后跟踪到原始源对象
=> 编译器能够找出指针的确切类型。
=>编译器知道被调用的确切函数的地址
=> 不需要虚拟表。
对象类型跟踪保存每个类实例的虚拟表内存和虚拟表指针。
对象类型跟踪在哪里不起作用?
图书馆链接。
如果库函数返回一个基类指针,编译器就无法追踪到原始源对象。编译器大概可以适应库代码和非库代码。对于导出的库类,使用虚拟表。对于其他类,只需跟踪它们的对象类型以节省内存。
不知道以上说法是否有错误,如有错误请指出。先谢谢了~