【问题标题】:When do I use a Virtual Constructor in C++ [duplicate]我什么时候在 C++ 中使用虚拟构造函数 [重复]
【发布时间】:2012-03-15 13:05:14
【问题描述】:

可能重复:
Where virtual constructors are used?

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

虽然 C++ 不直接支持它。有几种解决方案可以启用此功能。我想知道,我们什么时候需要这样的东西。

【问题讨论】:

标签: c++


【解决方案1】:

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

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

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

【讨论】:

  • +1 虽然准确地说这是一个虚拟 copy 构造函数,因此具有非常特殊的用途。
  • 我了解这种情况下的用法。但是,根据我的理解,虚拟意味着要稍后确定的东西(比如在运行时),所以虚拟构造函数意味着,在运行时根据一些输入参数构造一个对象。示例:在工厂方法中,我们在运行时基于某个参数创建派生类。是不是也是虚构造函数的另一种应用?
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多