我试着查看虚拟功能是在编译期间还是在运行时确定的。 看着我发现了一些动态链接/后期绑定 但我不明白这是否意味着函数本身在可执行文件之前或可执行文件期间的编译过程中确定。
有人可以解释一下吗?
答案 0 :(得分:3)
对于虚拟功能,解析在运行时完成。当你有一个对象的实例时,只有在程序运行时才知道要调用哪个方法的解析,因为只有在运行时才知道这个实例的确切类型。对于非虚函数,此解析可以在编译时完成,因为已知只能调用此方法并且不能覆盖它的子类。这就是为什么虚方法调用有点慢(绝对可忽略但比非虚方法调用慢)。 This article更详细地解释了这个概念。
答案 1 :(得分:2)
通常在运行时解析虚函数。原因很明显:您通常不知道在呼叫站点将调用哪个实际对象。
Base *x; Derived *y;
Call1(y);
void Call1(Base *ptr)
{
ptr->virtual_member();
// will it be Base::virtual_member or Derived::virtual_member ?
//runtime resolution needed
}
这种情况,当不清楚在某个代码位置调用什么函数,并且仅在运行时它实际确定时,称为后期绑定。
但是,在某些情况下,您可能知道您要拨打的功能。例如,如果您不通过指针调用:
Base x; Derived y;
Call2(y);
void Call2(Base ptr)
{
ptr.virtual_member();
// It will always be Base::virtual_member even if Derived is passed!
//No dynamic binding necessary
}
答案 2 :(得分:0)
虚拟函数调用的名称查找,重载解析和访问检查在编译时在用于调用虚函数调用的对象表达式的'static'类型中发生(即,如果对象表达式是指针类型或者引用多态基类)。
然后,在运行时调用的实际函数取决于基类指针或引用指向的对象表达式的动态类型。