让Base
和Derived
成为具有数据成员的类:
class Base {
public:
Base(int i):f(i) { }
virtual void print() { cout << "base " << f << endl; }
int f;
};
class Derived: public Base {
public:
Derived(int i):Base(0),g(i) { }
void print() { cout << "derived " << g << endl; }
int g;
};
现在在堆上创建 和 的一些实例Base
并将Derived
它们存储在 a 中boost::ptr_vector
:
int main(int argc, char *argv[])
{
boost::ptr_vector<Base> v;
v.push_back(new Derived(1));
v.push_back(new Base(2));
v.push_back(new Base(3));
v.push_back(new Derived(4));
打印所有对象:
for (std::size_t i(0); i != v.size(); ++i)
v[i].print();
然后反转并再次打印:
std::reverse(v.begin(), v.end());
for (std::size_t i(0); i != v.size(); ++i)
v[i].print();
}
该程序打印:
derived 1
base 2
base 3
derived 4
derived 1
base 3
base 2
derived 4
std::reverse()
onboost::ptr_vector
调用std::iter_swap()
又调用std::swap
which 通过创建临时副本来交换项目。
但是,临时副本确实对 Derived 对象进行了切片。如您所见,int g
对象Derived
1 和 4 的没有交换,因此交换后对象已损坏。
这种行为让我很困惑。容器不boost::ptr_vector
就是要避免这种问题吗?
我在这里需要的是一个虚拟复制构造函数,它在 C++ 中不存在。
我该如何解决这个问题?我是否需要为 实现一个虚拟交换函数Base
,以便虚拟调度调用另一个交换成员函数Derived
?
编辑:为什么首先要复制对象?由于向量只存储指针,因此反转它应该是指针的交换,而不是指向的对象!有没有这样做的功能?