当我有具体类型时,动态调度会起作用吗?
Does dynamic dispatch come into play when I have a concrete type?
假设我有一个 class Interface
提供纯虚函数。
现在假设我有两个 classes Concrete1
和 Concrete2
.
我这样实例化它们:
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 上的帮助或在方法上。
假设我有一个 class Interface
提供纯虚函数。
现在假设我有两个 classes Concrete1
和 Concrete2
.
我这样实例化它们:
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 上的帮助或在方法上。