【发布时间】:2017-04-22 18:32:16
【问题描述】:
我有一个容器,其中包含std::vector<std::shared_ptr<Base> > vec 中基类Base 的shared_ptr,这个容器也有函数add(Base&& base) - 它通过使用std::move 运算符将基对象添加到vec,但派生的移动构造函数不调用,仅调用了基本移动构造函数。
如何解决:我应该使用 dynamic_cast<Derived*>(&base) 将其转换为 Derived,然后使用 std::move。
问题:我是否需要尝试强制转换为所有可能的派生类,然后使用std::move?
class Base{
public:
virtual ~Base(){}
Base(const Base& base) = delete;
Base(Base&& base){
std::cout<<"base move\n";
}
Base(){}
virtual void func(){
std::cout<<"run func from BASE class\n";
}
};
class Derived: public Base{
public:
virtual ~Derived() = default;
Derived(Derived&& derived):Base(std::move(derived)){
std::cout<<"Derived move\n";
}
Derived():Base(){
}
virtual void func() override {
std::cout<<"run func from DERIVED class\n";
}
};
class Container{
std::vector<shared_ptr<Base> > vec;
public:
void add(Base&& base){
this->vec.push_back(std::make_shared<Base>(std::move(base)));
}
void addDerived(Base&& base){
//TRY ALL POSSIBLE CASTING???
this->vec.push_back(std::make_shared<Derived>(std::move( *(dynamic_cast<Derived*>(&base)) )));
}
void print(){
for(auto& obj: vec){
obj->func();
}
}
};
int main() {
std::cout << "Create container and add using function `add`" << std::endl;
Container container;
container.add(Derived());
container.print();
std::cout << "Create container and add using function `addDerived`" << std::endl;
Container container_new;
container_new.addDerived(Derived());
container_new.print();
}
//Will print
Create container and add using function `add`
base move
run func from BASE class
Create container and add using function `addDerived`
base move
Derived move
run func from DERIVED class
【问题讨论】:
标签: c++ inheritance c++14 move-constructor