使用 std::function 调用基类方法

Calling base class method with std::function

提问人:Denis Zlobin 提问时间:7/11/2023 更新时间:7/11/2023 访问量:73

问:

我使用了基本类虚拟方法,结果很奇怪。然后我调用 object,调用派生的(非基本)方法。拜托,你能告诉我有问题吗?std::functionstd::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");
}
C++ oop std 函数

评论

0赞 Some programmer dude 7/11/2023
生成时会发生什么情况(启用了额外警告)?如果它构建得很干净,那么当你运行它时会发生什么?您希望在构建或运行时发生什么?您遇到了什么问题?
0赞 Some programmer dude 7/11/2023
另外,请花一些时间阅读帮助页面,参加 SO 导览,并阅读如何提问。另外,请阅读如何写“完美”问题,尤其是它的清单

答:

2赞 Alan Birtles 7/11/2023 #1

我不认为这是不可能的,你可以用 lambda 来做到这一点:std::bind

std::function<void(const std::string&)> f = [this](const std::string& name) {
  A::username(name);
};

默认情况下,指向虚拟方法的成员函数指针将使用虚拟调度,要调用基类方法,您需要使用不同的语法,但这是不可能的std::bind

评论

0赞 Denis Zlobin 7/11/2023
谢谢你非常匹配!这是正确的工作。