C++ 设备化子类调用
假设我有一个父类实现了一个虚拟方法,由子类覆盖。我知道,如果对类型为Parent的变量调用该方法,那么编译器必须使用某种方法来检查在运行时应该调用该方法的哪个实现,但是如果该变量类型为Child,那么这肯定不是必需的?在这种情况下,假设该方法不再被child的子级重写,编译器是否会对该方法进行设备化,因为已知该变量肯定会包含子级,并且该编译器是否特定?,以便反虚拟化调用,编译器必须确定没有派生类型的子类,它可能会通过以下代码传递:C++ 设备化子类调用,c++,C++,假设我有一个父类实现了一个虚拟方法,由子类覆盖。我知道,如果对类型为Parent的变量调用该方法,那么编译器必须使用某种方法来检查在运行时应该调用该方法的哪个实现,但是如果该变量类型为Child,那么这肯定不是必需的?在这种情况下,假设该方法不再被child的子级重写,编译器是否会对该方法进行设备化,因为已知该变量肯定会包含子级,并且该编译器是否特定?,以便反虚拟化调用,编译器必须确定没有派生类型的子类,它可能会通过以下代码传递: void f(Child* c) { Child* l
void f(Child* c) {
Child* l = new Child;
c->virtFn();
l->virtFn();
}
对virtFn的c调用可以是派生类型,但l调用不能
C++11引入了最后一个关键字,它可以帮助实现这一点,并允许编译器通过终端类指针/ref对调用进行设备化。您所说的“变量”是什么意思?显然,如果最派生的类型是
Parent
,则不需要分派任何内容:Parent v;v、 f()代码>(可以静态调度,调用Parent::f
)调用final
做得很好:下面是一个优化示例。我很惊讶编译器不容易知道是否存在任何派生类。感谢您的决赛
tip@user3834847如果有足够的选项(如整个程序),优化器可能会