当我调用一个仅在派生类中是虚拟的函数时,会发生什么

Adr*_*ian 0 c++

这是我的代码:

class Base {
public:
    void foo() {
        cout << "Base::foo" << endl;
    }
};

class Derived : public Base {
public:
    virtual void foo() {
        cout << "Derived::foo" << endl;
    }
};

int main()
{
    Base* base = new Derived;
    base->foo();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会打电话Base::foo.在使用此代码时,我很好奇发生了什么.我知道将为其创建Derived一个包含指针的表,foo并且还有一个由Derived构造函数初始化的指针,该指针将指向包含虚函数的表.

所以结果表明静态绑定正在发生,我很好奇这是怎么发生的?

我想我有点困惑,因为如果Base::foo是虚拟的那么在Derivedv-table Base::foo中将被覆盖Dervied::foo(现在就是这种情况).

在编译代码时,编译器是否看到它Base::foo不是虚拟的并执行静态绑定?这是答案还是有另一个答案?

Luc*_*ore 5

调用在编译时解析,就像对非virtual函数的任何其他调用一样.由于指针是类型的Base*,并且方法in Base不是虚拟的,因此不会进行查找,并且它基本上被转换为

base->Base::foo();
Run Code Online (Sandbox Code Playgroud)