c++ - 接口(interface)虚表

标签 c++ interface polymorphism vtable

接口(interface)(仅具有纯虚函数的多态类)是否有 vtable? 由于接口(interface)本身不实现多态函数并且不能直接构造,因此链接器不需要放置 vtable。是这样吗?我特别关心 MSVC 编译器。

最佳答案

是的,他们有。这有很多充分的理由。

第一个很好的理由是即使是纯虚方法也有实现。或隐或显。实现调用纯虚函数的技巧相对容易,因此您基本上可以为您的一个定义,调用它并查看会发生什么。因此,首先应该有一个虚拟表。

将虚拟表放入基类还有另一个原因,即使它的所有方法都是纯虚拟的并且没有其他数据成员。当使用多态性时,指向基类的指针会在整个程序中传递。为了调用虚方法,编译器/运行时应该计算出虚表与基指针的相对偏移量。如果 C++ 没有多重继承,可以假设抽象基类的偏移量为零(例如),在这种情况下,那里可能没有 vtable(但由于原因 #1,我们仍然需要它)。但是由于涉及到多重继承,因此“vtable 在 0 偏移处”这样的技巧将不起作用,因为根据基类的数量(和类型)可能存在两个或三个 vtable。

可能还有其他我没有想到的原因。

希望对你有帮助。

关于c++ - 接口(interface)虚表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196329/

相关文章:

c++ - Qt tableView - 添加颜色

java - 为什么可以将变量赋值给接口(interface)类型?

java - 如何在搜索例程中避免使用instanceof?

c++ - 什么时候使用虚拟析构函数?

c# - 需要有关泛型、接口(interface)和基类的帮助

java - 在 Java 中避免使用 instanceof

c++ - 如何在openCV中创建自己的矩阵

c++ - 敌人的路径跟踪(Space Shooter游戏)

c++ - NULL 与抛出和性能

c# - 具有多个接口(interface)限制的方法参数