c++ - 使用成员函数指针调用正确的虚方法

标签 c++ function virtual

在下面的示例中,我试图将问题减少到最小,有 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/

相关文章:

c++ - 清除 vector<pointer> 然后重新使用它

c++ - 排序 vector <const char *>

python - 如何在Python中使用递归函数找到最大公约数?

windows - 是否有适用于 Windows 的免费或开源虚拟内存驱动器?

c - 这是什么语法? (tty_write_unlock)

javascript - 仅跟踪过去一周帖子浏览量的功能

c++ - 为什么我必须重新声明继承类的虚函数?

c++ - C++ 中全局函数中的静态常量

c++ - 使用 sqlite 和 c++ 对数据库表进行实际排序的最佳方法?

c++ - 关于使用单例 CRTP 的模板参数类型的内联静态成员,哪个编译器是正确的?