我想使用std :: bind并对基类函数进行非虚拟调用,例如:derived_obj.BaseClass :: foo()
例:
假设我有基类A和派生类B.A有一个虚函数foo()被B覆盖.
@H_403_6@class A { public: virtual void foo() { std::cout << "Hello from A::foo()!";} } class B : public A { public: void foo() overide { std::cout << "Hello from B::foo()!";} }如果我想从B类对象调用A :: foo(),我会进行非虚拟调用:
@H_403_6@B b_obj; b_obj.A::foo(); // prints "Hello from A::foo()!"现在我想使用std :: bind并从b_obj对A :: foo()进行非虚拟调用,我该怎么做?
我已经尝试将b_obj转换为A并使用& A :: foo()的地址,但没有运气.
@H_403_6@auto f = std::bind(&A::foo,static_cast<A*>(&b_obj)); f(); // prints "Hello from B::foo()!" but it should print "Hello from A::foo()!"解决方法
你有两个选择.您应该在lambda中执行非虚拟调用,或者您可以使用可靠的旧方法来切换要传递给std :: bind的对象(这是一个副本).
@H_403_6@// Base method
B b_obj; b_obj.A::foo(); // prints "Hello from A::foo()!"
// First method
auto k = [](auto b){ b.A::foo(); };
k(b_obj);
// Second method
auto f = std::bind(&A::foo,*static_cast<A*>(&b_obj));
f();
所有打印:
@H_403_6@Hello from A::foo()! Hello from A::foo()! Hello from A::foo()!第二种方法起作用(切片),因为std :: bind复制了它的参数.你应该更喜欢lambda.