在下面的示例中,我试图将问题减少到最小,有 4 个类 A、B、C、D。,它们形成了继承层次结构
当程序启动时,会创建D类中的一个对象d,并调用D类的test方法。该方法依次调用C类的caller方法。该方法尝试使用成员函数指针来调用正确的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、
最佳答案
你确定它只打印“IN B”?我在MSVC2012上编译,得到了
IN B
IN C
IN D
此外,您的原始代码无法在 VS2012 上编译,至少在我将 public
: 添加到每个类之前。例如:
class C : public B{
public: // <--- here
virtual void f() { B::f(); cout << "IN C" << endl; }
virtual void caller(){
void (A::*cb)() = NULL;
cb = &A::f;
(this->*cb)();
}
};
关于c++ - 使用成员函数指针调用正确的虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15534241/