这是我的代码:
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不是虚拟的并执行静态绑定?这是答案还是有另一个答案?
调用在编译时解析,就像对非virtual函数的任何其他调用一样.由于指针是类型的Base*,并且方法in Base不是虚拟的,因此不会进行查找,并且它基本上被转换为
base->Base::foo();
Run Code Online (Sandbox Code Playgroud)