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