【发布时间】:2014-10-23 11:56:55
【问题描述】:
我正在尝试让这样的事情起作用:
int main()
{
class Base
{
public:
Base() = default;
virtual void print() = 0;
void CallThread()
{
std::thread(&Base::print, *this);
};
};
class derived1 : public Base
{
public:
derived1() = default;
void print() { printf("this is derived1\n"); }
};
class derived2 : public Base
{
public:
derived2() = default;
void print() { printf("this is derived2\n"); }
};
Base* ptr;
ptr = new derived1();
ptr->CallThread();
return 0;
}
我想要发生的结果是:
这是派生出来的1。
问题是它甚至无法编译。我正在使用 VisualStudio 2013。
错误是:
错误 2 错误 C3640: 'main::Base::[thunk]: __thiscall
main'::2'::Base::`vcall'{0,{flat}}' }'' : 引用的或虚拟的 必须定义本地类的成员函数
任何想法如何使这项工作?
编辑:为了清楚起见,我在线程中尝试做的事情更复杂,这只是我的程序结构的一个例子(所以 lambda 对我来说不是一个好主意)
【问题讨论】:
-
你不能只使用 lambda 吗?
-
不确定错误,但不应该将
std::thread(&Base::print, *this);设为std::thread(&Base::print, this);,以免创建Base的副本?还是副本是有意的? -
@Niall 您已经发现了问题:您无法创建抽象类的实例。
std::thread(&Base::print, *this)尝试为线程创建Base的副本。std::ref或指针是必需的。但是,一旦使用指针或引用,就会出现终身问题。另外,线程必须分离或加入,否则会抛出异常。
标签: c++ c++11 polymorphism