如果被重写的C++函数调用父函数,该函数调用另一个虚函数,则调用什么?

ODd*_*dol 4 c++ polymorphism

我正在学习多态性,我对这种情况很困惑:假设我有以下C++类:

class A{
    ...
    virtual void Foo(){
        Boo();
    }
    virtual void Boo(){...}
}

class B : public A{
    ...
    void Foo(){
        A::Foo();
    }  
    void Boo(){...}
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个B实例并调用它的Foo()函数.当该函数调用A :: Foo()时,使用的Boo()方法是A类还是B类?谢谢!

Dav*_*eas 9

除非您使用类限定函数调用,否则所有方法调用都将被视为相等,即动态分派(如果是虚拟),静态分派(如果不是虚拟).当您完全使用类名限定时,您调用的方法实际上是禁用动态调度机制并引入直接方法调用.

class A{
    virtual void Foo(){
        Boo();           // will call the final overrider
        A::Boo();        // will call A::Boo, regardless of the dynamic type
    }
    virtual void Boo();
};
class B : public A{
    void Foo(){
        //Foo();         // Would call the final overrider 
                         // (in this case B: infinite recursion)
        A::Foo();        // Will call A::Foo, even if the object is B
    }  
    void Boo();
};
Run Code Online (Sandbox Code Playgroud)

隐式this指针不是此处讨论的重要部分,因为使用显式对象进行调用时会发生完全相同的情况:

B b;
b.Foo();    // will call B::Foo -- note 1
b.A::Foo(); // will call A::Foo
Run Code Online (Sandbox Code Playgroud)

注1:在这个例子中,编译器可以忽略动态调度机制,因为它知道实例的具体类型(它看到定义并且它不是引用/指针)但你可以想象如果b是引用的话会发生同样的情况,或等效地,如果它是一个指针->而不是.