【发布时间】:2015-09-08 15:56:45
【问题描述】:
假设我们有一个基类A 至少有一个虚方法。假设我们有另一个类 B 派生自 A 并且可能会或可能不会覆盖此虚拟方法。
最后,假设您创建了一个具有本地范围的B 类的对象,并调用此虚拟方法。
从 C++ 文档中我们知道,如果这个虚方法是内联的,则将使用内联版本,因为类类型是已知的,这不是指针或引用,而是类本身。
在这种情况下会使用虚拟调度还是会被绕过?这适用于普通(非内联)方法吗?
我对 gcc/clang 感兴趣。
【问题讨论】:
-
C++ 没有 vtable 的概念,这是特定于编译器实现的。
-
谢谢。使用 gcc 标签更新的问题
-
如果你在栈上创建B,那么编译器就知道它是什么类型了,所以它不需要经过vtable。如果您要传递对象,请注意切片问题。