使用std :: bind绑定到父虚拟函数的版本

时间:2013-10-08 14:06:15

标签: function inheritance c++11 std-function stdbind

我想为父类的虚拟和重写函数版本创建一个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

1 个答案:

答案 0 :(得分:0)

你可以写一个小仿函数来做到这一点:

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

并使用

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

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