英文:
Calling base class method with std::function
问题
我在基本类虚方法中使用了std::function
,结果出现了奇怪的问题。然后我调用了std::function
对象,却调用了派生(而不是基本)方法。请问,你能告诉我问题出在哪里吗?
#include <functional>
#include <iostream>
#include <string>
struct A
{
virtual void username(const std::string& name)
{
std::cout << "A: username" << name << '\n';
}
A* A_ptr()
{
return this;
}
};
struct B : public A
{
void username(const std::string& name) override
{
std::function<void(const std::string&)> f = std::bind(&A::username, A::A_ptr(), std::placeholders::_1);
wrapper(f, name);
}
void wrapper(const std::function<void(const std::string&)>& f, const std::string& s)
{
f(s);
}
};
int main()
{
B b;
b.username("tname");
}
注意:这段代码中的问题在于std::function
的绑定,在B
类中的username
方法中,它绑定了基类A
的username
方法,导致了派生类B
的username
方法无法被正确调用。
英文:
I used std::function
for basic class virtual method and had strange result. Then I call std::function
object, derived (not basic) method is called. Please, can you tell me there is the problem?
#include <functional>
#include <iostream>
#include <string>
struct A
{
virtual void username(const std::string& name)
{
std::cout << "A: username" << name << '\n';
}
A* A_ptr()
{
return this;
}
};
struct B : public A
{
void username(const std::string& name) override
{
std::function<void(const std::string&)> f = std::bind(&A::username, A::A_ptr(), std::placeholders::_1);
wrapper(f, name);
}
void wrapper(const std::function<void(const std::string&)>& f, const std::string& s)
{
f(s);
}
};
int main()
{
B b;
b.username("tname");
}
答案1
得分: 2
我不认为使用 std::bind
是可能的,但你可以使用 lambda 表达式来实现:
std::function<void(const std::string&)> f = [this](const std::string& name) {
A::username(name);
};
默认情况下,对虚拟方法的成员函数指针将使用虚拟分发,要调用基类方法,你需要使用不同的语法,这在使用 std::bind
时不可能实现。
英文:
I don't think is is possible with std::bind
, you can do it with a lambda though:
std::function<void(const std::string&)> f = [this](const std::string& name) {
A::username(name);
};
By default a member function pointer to a virtual method will use virtual dispatch, to call the base class method you need to use a different syntax which isn't possible though std::bind
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论