我有基类和2个从基类继承的其他类。我想创建一个线程,可以运行Derived_* 类中的覆盖函数。可以选择函数的哪个版本。当我创建示例代码中的线程时,编译错误。我应该怎么做?
更新:正如在注解中指出的,我不能将unique_ptr传递给std::thread构造函数。使用std::move或std::async都可以。谢谢你的帮助!
#include <string>
#include <iostream>
#include <thread>
#include <vector>
class Base{
public:
virtual void print(const std::vector<int> &vec);
};
void Base::print(const std::vector<int> &vec){
std::cout << "run Base::print" << std::endl;
}
class Derived_1: public Base{
public:
virtual void print(const std::vector<int> &vec) override;
};
void Derived_1::print(const std::vector<int> &vec){
std::cout << "run Derived_1::print" << std::endl;
for(int i = 0; i < (vec.size()); i++){
std::cout << vec[i] << " ";
}
std::cout << std::endl;
}
class Derived_2: public Base{
public:
virtual void print(const std::vector<int> &vec) override;
};
void Derived_2::print(const std::vector<int> &vec){
std::cout << "run Derived_2::print" << std::endl;
for(int i = 0; i < (vec.size()); i++){
std::cout << vec[i] << " ";
}
std::cout << std::endl;
}
int main(){
int classType = 0;
std::unique_ptr<Base> base;
std::vector<int> vec{0, 1, 2};
if(classType){
base = std::make_unique<Derived_1>();
}else{
base = std::make_unique<Derived_2>();
}
std::thread th(&Base::print, base, std::ref(vec));
th.join();
return 0;
}
1条答案
按热度按时间2wnc66cl1#
base
是std::unique_ptr<Base>
的对象,你需要传递Base
的Object。如果你传递(*base
),它将调用基类的方法。base.get()
完成这项工作,并通过传递派生对象ptr来调用派生类的适当方法。--这也适用:
base->print
调用派生类的相应方法。