在下面的示例中,我试图将问题减少到最小,有 4 个类A、B、C、D。, 形成继承层次结构
程序启动时,会创建一个来自D类的对象 d,并调用D类的测试方法。该方法依次调用C类的调用者方法。此方法尝试使用成员函数指针来调用正确的f方法。在这种情况下,它应该调用与类D相关联的f方法,但它调用与类B相关联的方法。
怎么来的 ?
class A {
public:
virtual void f() = 0;
};
class B : public A{
public:
virtual void f() { cout << "IN B" << endl;}
};
class C : public B{
public:
virtual void f() { B::f(); cout << "IN C" << endl; }
virtual void caller(){
void (A::*cb)() = NULL;
cb = &A::f;
(this->*cb)();
}
};
class D : public C{
public:
virtual void f() { C::f(); cout << "IN D" << endl; }
void test(){
caller();
}
};
int main(){
D d;
d.test(); // Why does this prints only "IN B"
return 0;
}
更新:代码确实有效,问题与提供的代码无关,似乎来自提供 A、B、C 类的库与提供 D 类的库之间的版本不匹配。