파생 생성하지 않는,이 컨테이너는 기능 add(Base&& base)
이있다 - 어떤 std::move
연산자를 사용하여 VEC에 기본 오브젝트를 추가,하지만 파생 이동 생성자는하지 않습니다 호출, 기본 이동 생성자 만 호출됩니다.표준 : 이동이 나는 <code>std::vector<std::shared_ptr<Base> ></code> VEC의 기본 클래스 <code>Base</code>에있는 shared_ptr을 포함 컨테이너가 클래스
수정 방법 : dynamic_cast<Derived*>(&base)
을 사용하여 Derived로 변환 한 다음 std::move
을 사용해야합니다.
질문 : 가능한 모든 파생 클래스에 캐스트를 시도한 후에 std::move
을 사용해야합니까?
void add(Base&& base){
this->vec.push_back(std::make_shared<Base>(std::move(base)));
}
그냥 항상 Base
을 만드는 :
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
감사! 그러나 현재의 컨텍스트에서는 인터페이스에서 shared_ptr을 전달할 수 없습니다. 입력 인자가 initializer_list 인 값을 생성자 내부의 벡터로 전달합니다. 내 업데이트를 확인하십시오! –