2017-07-18 118 views
1

可以说我有两个类,BaseDerived具有可变告诉对象是否为Derived类型:从基础对象复制派生对象(智能)指针

class Base { 
public: 
    Base() : is_derived(false) {} 
    bool is_derived; 
}; 

class Derived : public Base { 
public: 
    Derived() : is_derived(true) {} 
    int derived_only_member; 
}; 

我有的std::shared_ptr的一个std::setBase对象:

std::set<std::shared_ptr<Base> > bases; 
// Populate this set one way or another 

我有必要通过设置迭代和仅复制Derived物体插入肛门疗法类似的一组Base共享指针:

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    if(b->is_derived) { 
     copies.insert(/*Somehow copy the `Derived` object and assign a `std::shared_ptr<Base>` to it */); 
    } 
} 

如果我知道Base指针指向一个Derived对象,我怎么能复制它,这样的副本有derived_only_member相同的值?

有没有一种方法可以做到这一点,而没有一个拷贝构造函数的参数为​​每个成员变量Derived有和Base没有?我的真实版本Derived有许多成员,所以这将是不切实际的。

回答

0

有没有办法做到这一点,而不具有对每一个成员变量的说法,Derived已经和Base没有一个拷贝构造函数?

复制构造函数不需要每个成员变量的参数。编译器也已经为你生成了一个。

你需要有什么是投:

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    if(b->is_derived) { 
     copies.insert(std::make_shared<Derived>(static_cast<Derived>(*b))); 
              // ^^^^^^^^^^^^^^^^^^^^^^
    } 
} 

注:

你甚至都不需要is_derived成员检查从Base被衍生的实例。您可以使用dynamic_cast代替:

std::set<std::shared_ptr<Base> > copies; 
for(auto &b: bases) { 
    Derived* org = dynamic_cast<Derived*>(b.get()); 
    if(org) { 
     copies.insert(std::make_shared<Derived>(*org)); 
    } 
} 
+0

和拷贝将有'derived_only_member'与原相同的值'Derived'对象? –

+0

@Kai当然,它会的。 – user0042

相关问题