gpt4 book ai didi

c++ - std::bind 和对基类方法的非虚拟调用

转载 作者:可可西里 更新时间:2023-11-01 18:38:21 25 4
gpt4 key购买 nike

我想使用 std::bind 并对基类函数进行非虚拟调用,例如:derived_obj.BaseClass::foo()


示例:

假设我有基类 A 和派生类 BA 有一个虚函数 foo()B 覆盖。

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() 我会进行非虚拟调用:

B b_obj;
b_obj.A::foo(); // prints "Hello from A::foo()!"


现在我想使用 std::bind 并从 b_obj 对 A::foo() 进行非虚拟调用,我该怎么做?

我已经尝试将 b_obj 转换为 A 并使用 &A::foo() 的地址,但没有成功。

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.

// 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();

这一切打印:

Hello from A::foo()!
Hello from A::foo()!
Hello from A::foo()!

第二种方法 有效(切片),因为 std::bind 复制了它的参数。您应该真的更喜欢 lambda。

关于c++ - std::bind 和对基类方法的非虚拟调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38500198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com