我何时在C ++中使用虚拟构造函数

时间:2012-03-15 13:05:14

标签: c++

  

可能重复:
  Where virtual constructors are used?

为什么我们需要在C ++中使用虚拟构造器?

虽然C ++没有直接支持它。有几种解决方案可以实现此功能。我想知道,当我们需要这样的事情时。

1 个答案:

答案 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()函数复制它们,该函数基本上只调用它自己的复制构造函数。

注意:这只是使用虚拟构造函数的一种可能用法。还有很多其他时候你可能想复制一些东西而不知道它的实际课程。