当我有具体类型时,动态调度会起作用吗?

Does dynamic dispatch come into play when I have a concrete type?

假设我有一个 class Interface 提供纯虚函数。
现在假设我有两个 classes Concrete1Concrete2.

我这样实例化它们:

Interface* impl = createConcrete1orConcrete2(); // randomly select Concrete1 or Concrete2
Concrete1* concrete = new Concrete1();
impl->foo();
concrete->foo();

concrete会使用动态调度吗?

编译器必须进行动态分派,但遵循 as-if 规则,如果它知道最终的动态类型作为优化,它可能会将调用去虚拟化。

确实如此,new Concrete1();,动态类型是已知的。

但对于 Concrete* ConcreteFactoryCreate(),它不会(Concrete 可能仍然派生出 classes)除非 final 在 class 上的帮助或在方法上。