【发布时间】: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->Parent::func2(); }这样的 lambda。 -
为什么 Parent::func2 在 std::bind 的调用中被分派给 Child::func2 而 Parent::func1 不是?尽管您的解决方法可能有效,但我想了解为什么会这样。
-
因为虚拟调度仍然完成,据我所知,它只能通过显式父函数调用被禁用。
标签: function inheritance c++11 std-function stdbind