修改继承的成员变量不影响基class

Modifying an inherited member variable does not affect base class

我有以下两个类:

class A
{
public:

    A() : value(false) {}

    bool get() const
    {
        return value;
    }

protected:
    bool value;
};

class B : public A
{
public:

    void set()
    {
        value = true;
    }
};

现在我使用它们如下:

B* b = new B;
std::shared_ptr<A> a(b);

auto func = std::bind(&B::set, *b);

std::cout << a->get() << std::endl;
func();
std::cout << a->get() << std::endl;

我希望在第二次调用时 a->get() 变为 return true,但是 func() 没有修改它的值。这是为什么?

std::bind 按值获取其参数,因此您正在对 *b.

的副本进行操作

您需要通过 std::ref:

传递原始对象
auto func = std::bind(&B::set, std::ref(*b));

Live demo

或者更简单的形式是将指针传递给 bind:

auto func = std::bind(&B::set, b);