我试过运行以下命令:
struct B;
struct C;
struct A{
A() { f(this);}
virtual A* f(A* a) {
cout << " A::f(A)" <<endl;
return a;
}
void h() { cout << typeid(*this).name() << endl;}
void g(B* b);
};
struct B:A{
B() { f(this); }
virtual A* f(A* a) {
cout << "B::f(A)" << endl;
return a;
}
virtual B* f(B* b) {
cout << "B::f(B)" << endl;
return b;
}
virtual C* f(C* c) {
cout << "B::f(C)" << endl;
return c;
}
};
struct C: B{};
void A::g(B* b) { cout << typeid(*this).name() << endl; f(b);};
int main(){
B* b = new B();
cout << "------" << endl;
C* c = new C();
cout << "------" << endl;
c->g(b);
return 0;
}
请注意, g() 是非虚拟的,因此它是在编译期间选择的。
运行它时,我得到以下输出:
A::f(A)
B::f(B)
------
A::f(A)
B::f(B)
------
1C
B::f(A) <----- Notice this
请注意,最后一行似乎调用了 f(),就好像它是动态绑定的,但只调用了 A 知道的方法 f()(我认为这与 g() 是静态绑定的事实有关)。我期望发生的是得到 B::f(B)。
为什么 f() 在 g() 中的调用是在编译时计算的?