gpt4 book ai didi

c++ - 将虚拟成员方法传递给 thread()

转载 作者:行者123 更新时间:2023-11-30 01:17:01 25 4
gpt4 key购买 nike

我正在尝试将虚方法传递给线程类的构造函数(C++ 线程)。

在全面搜索之后,我只能传递一个非虚成员方法。

我的基类 A 有一个 start 方法,如下所示:

void A::start() {
thread(&A::runnable,A()); // <--- What do I change here?
}

函数runnable 是虚函数,也在派生类B 中实现。我在派生类 B 中覆盖了 runnable。

然后我在 B 上调用start

显然,start 函数使用 runnableA(而不是 B)中实现,这是不受欢迎的,因为它在 A::start 中明确定义。有没有办法让runnable函数动态绑定(bind)?

我想到了使用模板和其他一些创造性的解决方案。 (如果没有真正的解决方案,我最终会在 B 中实现 start)

如有任何帮助,我们将不胜感激。

最佳答案

Obviously, and undesirably, the start function uses runnable implemented in A (instead of B) because it is explicitly defined in A::start.

这对您来说可能是显而易见的,但它是不正确的。当你创建一个线程时,你传递了一个类 A 的未命名临时实例,它显然具有 A 类型,因此 A::runnable 将始终被调用, 但你应该传递 this:

void A::start() {
thread(&A::runnable,this); // <--- What do I change here?
}

然后将调用适当的虚函数。参见 Boost::Bind and virtual function overloads: why do they work?详细原因。

关于c++ - 将虚拟成员方法传递给 thread(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25411525/

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