C++ 带多态性的std::bind和std::函数,基类

C++ 带多态性的std::bind和std::函数,基类,c++,std,C++,Std,我试图将一个对象绑定到一个函数,但是正在调用基类函数。 代码它只是一个真实代码的示例。 我将只在以后的实际代码中使用字符串 class A { public: virtual void f(const std::string &s) { std::cout << "A " << s << std::endl; } }; class B : public A {

我试图将一个对象绑定到一个函数,但是正在调用基类函数。 代码它只是一个真实代码的示例。 我将只在以后的实际代码中使用字符串

 class A {
    public:
        virtual void f(const std::string &s) {
            std::cout << "A " << s << std::endl;
        }
    };

    class B : public A {
    public:
        void f(const std::string &s) override {
            std::cout << "B " << s << std::endl;
        }
    };

    void main() {
        std::unique_ptr<A> a = std::make_unique<B>();

        std::function<void(const std::string &)> callback
                =  std::bind(&A::f, *a, std::placeholders::_1);
        callback("my string");
    }
我试图将其更改为&B:f,但出现了一个错误

No viable conversion from 'typename _Bind_helper<__is_socketlike<void (B::*)(const basic_string<char> &)>::value, void (B::*)(const basic_string<char> &), A &, const _Placeholder<1> &>::type' (aka '_Bind<void (Centerity::Cluster::Correlation::B::*(Centerity::Cluster::Correlation::A, std::_Placeholder<1>))(const std::basic_string<char> &)>') to 'std::function<void (const std::string &)>' (aka 'function<void (const basic_string<char> &)>')
没有从“typename\u Bind\u helper::type”(又名“\u Bind”)到“std::function”(又名“function”)的可行转换
我试着把它改成
A*A=B()相同的结果。
在任何地方都找不到类似的代码。
当然,创建
bb
将调用
B::f
,但这对我没有帮助

我可以失去绑定并使用lambda,但我不知道如何使用。

注意:

我不知道您正在使用哪个编译器,但不应该是无效的。我已经在下面的代码中修复了它:

#include <memory>
#include <iostream>
#include <functional>

class A {
public:
    virtual void f(const std::string &s)
    {
        std::cout << "A " << s << std::endl;
    }
};

class B: public A {
public:
    void f(const std::string &s) override 
    {
        std::cout << "B " << s << std::endl;
    }
};

int main() 
{
    std::unique_ptr<A> a = std::make_unique<B>();
    auto callback = std::bind(&A::f, a.get(), std::placeholders::_1);

    callback("my string");
    return 0;
}
捕获是将指向基类(指向派生类的对象)的指针传递给
std::bind(&A::f,A.get(),std::placeholders::_1)

如果按值传递,则将创建基类a的新对象(通过复制构造函数),并且将调用基类的f版本,正如您在程序中所观察到的那样。

当您请求lambda版本时:

A类{
公众:
虚空f(常量std::string&s){

std::cout main不是void!请注意,如果
A::~A
不是
virtual
,这是未定义的行为。太好了。别忘了向上投票,然后接受我的答案!我只能接受一个,然后抱歉,我会选择这个。是的,你可以选择一个已接受的答案,但你可以向上投票一个。
#include <memory>
#include <iostream>
#include <functional>

class A {
public:
    virtual void f(const std::string &s)
    {
        std::cout << "A " << s << std::endl;
    }
};

class B: public A {
public:
    void f(const std::string &s) override 
    {
        std::cout << "B " << s << std::endl;
    }
};

int main() 
{
    std::unique_ptr<A> a = std::make_unique<B>();
    auto callback = std::bind(&A::f, a.get(), std::placeholders::_1);

    callback("my string");
    return 0;
}
B my string
class A { 
    public:
        virtual void f(const std::string &s) {
            std::cout << "A " << s << std::endl;
        }   
};  

class B : public A { 
    public:
        void f(const std::string &s) override {
            std::cout << "B " << s << std::endl;
        }
};  

int main() {
    std::unique_ptr<A> a = std::make_unique<B>();

    auto callback = [&a](const std::string& s){ return a->f(s); };

    callback("my string");
}