【问题标题】:Use std::bind to bind to the parent's version of a virtual function使用 std::bind 绑定到父版本的虚函数
【发布时间】:2013-10-08 14:06:14
【问题描述】:

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

【问题讨论】:

  • 我不认为你可以直接这样做,它仍然只会做一个虚拟调度。一个更好的主意是像 [=]{ this-&gt;Parent::func2(); } 这样的 lambda。
  • 为什么 Parent::func2 在 std::bind 的调用中被分派给 Child::func2 而 Parent::func1 不是?尽管您的解决方法可能有效,但我想了解为什么会这样。
  • 因为虚拟调度仍然完成,据我所知,它只能通过显式父函数调用被禁用。

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


【解决方案1】:

你可以通过写一个小函子来做到这一点:

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

并使用

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

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

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多