1

我想为父类的虚拟和重写函数版本创建一个 std::function 对象,请参见以下示例:

#include <iostream>
#include <functional>

class Parent
{
    public:

        virtual void func1()
        {
            std::cout << "Parent::func1\n";
        }

        virtual void func2()
        {
            std::cout << "Parent::func2\n";
        }
};

class Child : public Parent
{
    public:

        // overrides Parent::func1
        virtual void func1()
        {
            std::cout << "Child::func1, ";
            Parent::func1();
        }

        // overrides Parent::func2
        virtual void func2()
        {
            std::cout << "Child::func2, ";
            std::function< void() > parent_func2 = std::bind( &Parent::func2, this );
            parent_func2();
        }
};

int main()
{
    Child child;

    child.func1(); // output: Child::func1, Parent::func1

    child.func2(); // output: Child::func2, Child::func2, ...

    return 0;
}

虽然调用child.func1()行为符合预期,但调用child.func2()变成了无限递归,parent_func2()似乎是调用Child::func2()而不是Parent::func2()我打算将其绑定到的位置。

知道我怎么能parent_func2()真正打电话Parent::func2吗?

4

1 回答 1

0

您可以通过编写一个小仿函数来做到这一点:

struct Parent_func2
{
  void operator()( Parent* p ) const
  {
    p->Parent::func2();
  }
};

并使用

std::function< void() > parent_func2 = std::bind( Parent_func2(), this );

(考虑一下,我想这只是 Xeo 建议的一种更冗长的方式。@Xeo,让你的评论成为答案,你有我的支持......)

于 2013-10-08T14:34:03.120 回答