我基本上有这个设置:
class B { /* ... */};
class C1 : public B { /* ... */};
class C2 : public B { /* ... */};
class X
{
std::vector<shared_ptr<B>> m_vec;
void addToVector(B* b);
}
addToVector
不知道有多少类派生自 B 并且不应该关心。它将被称为:
someFunction() {
C1 tmp;
/* do something with tmp */
m_myX.addToVector(&tmp);
}
所以在结束时someFunction
, tmp 超出范围并将被删除。addToVector
必须 push_back 一个 shared_ptr 到 tmp 的副本到向量中,但它怎么能做到呢?
void X::addToVector(B* b)
{
int i = sizeof(b); // allways sizeof(B) :(
shared_ptr<B> np(b);
m_vec.push_back(np); // garbage collected after calling fn returns :(
}
它应该做的是:
- 通过调用正确类的复制构造函数/操作符来复制 b 指向的对象
- push_back 将 shared_ptr 复制到向量中。
我怎样才能做到这一点?