为什么我们需要在C ++中使用虚拟构造器?
虽然C ++没有直接支持它。有几种解决方案可以实现此功能。我想知道,当我们需要这样的事情时。
答案 0 :(得分:5)
虚拟构造函数是克隆对象的能力,而不知道它是什么类型。当我们不知道对象的真实类型但需要它的副本时,这非常有用。假设我们有一个基类:
class Object
{
public:
Object() {};
virtual ~Object(){} = 0;
virtual Object* clone() const = 0;
};
我们从中得到了很多东西:
class MyClass : public Object
{
public:
MyClass() {};
MyClass(const MyClass& rhs) {}; // copy-constructor
virtual ~MyClass() { };
virtual MyClass* clone() const { return new MyClass(*this); }; // virtual ctor
};
class AnotherClass : public Object { /* etc */ };
现在,假设我们有一个这些Object派生类的向量:
std::vector<Object*> objects;
objects.push_back(new MyClass());
objects.push_back(new AnotherClass());
好的,现在我想复制该向量中的所有对象并将它们放在另一个对象中。这是克隆进来的地方!
std::vector<Object*> anotherVector;
for(std::vector<Object*>::const_iterator cit(objects.begin());
cit != objects.end();
++cit)
anotherVector.push_back((*cit)->clone());
因此,无需知道Object派生类的实际类型,我们可以通过clone()
函数复制它们,该函数基本上只调用它自己的复制构造函数。
注意:这只是使用虚拟构造函数的一种可能用法。还有很多其他时候你可能想复制一些东西而不知道它的实际课程。