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

vam*_*msi 1 c++

可能重复:
使用虚拟构造函数的位置?

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

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

Moo*_*ice 5

虚拟构造函数是克隆对象的能力,而不知道它是什么类型.当我们不知道对象的真实类型但需要它的副本时,这非常有用.假设我们有一个基类:

class Object
{
public:
    Object() {};
    virtual ~Object(){} = 0;
    virtual Object* clone() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

我们从中得到了很多东西:

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 */ };
Run Code Online (Sandbox Code Playgroud)

现在,假设我们有一个这些Object派生类的向量:

std::vector<Object*> objects;
objects.push_back(new MyClass());
objects.push_back(new AnotherClass());
Run Code Online (Sandbox Code Playgroud)

好的,现在我想复制该向量中的所有对象并将它们放在另一个对象中.这是我们的克隆进来的地方!

std::vector<Object*> anotherVector;
for(std::vector<Object*>::const_iterator cit(objects.begin());
    cit != objects.end();
    ++cit)
    anotherVector.push_back((*cit)->clone());
Run Code Online (Sandbox Code Playgroud)

因此,无需知道Object派生类的实际类型,我们可以通过clone()函数创建它们的副本,该函数基本上只调用它自己的copy-constructor.

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