虚拟复制构造函数(克隆函数)的意义何在?

What's the point of virtual copy constructors (clone functions)?

本文关键字:函数 构造函数 复制 虚拟      更新时间:2023-10-16

使用虚拟复制构造函数,类Vehicle具有copy()的虚拟成员函数,所有继承类(如Car)都将实现该函数。

之后,其他类可以将任何类型的vehicle作为成员变量:

struct Foo {
  Vehicle *v;
  Foo(const Vehicle &veh) {
    v = veh.clone();
  }
};
我不明白这有什么意义。为什么不去掉clone(),然后像这样"就地"处理new呢?
struct Foo {
  Vehicle *v;
  Foo(Vehicle *veh) {
    v = veh; //veh has no clone()
  }
  ~Foo() {
    delete v;
  }
};
//elsewhere
Foo f(new Car());

缺点是什么(除了它只适用于"就地"创建)?现在没有人需要实现克隆,一切似乎都容易多了。

它们的作用是当你有一个现有的指针指向基类,并且想要一个"whatever it is"的副本。

考虑:

class Base;
class Derived1 : public Base;
class Derived2 : public Base;
Derived1* d1 = new Derived1();
Derived2* d2 = new Derived2();
makeACopy(d1);
makeACopy(d2);
void makeACopy(Base* base) {
    // ???  What is it?
};

在您的示例中,它工作得很好。但是如果:

 Foo* MakeCar()
 {
    Car c;
    Foo *f = new Foo(&c); 
 }

或:

 Car *c = new Car;
 Foo f(c);
 delete c;
 ... use f in a way that needs c here. 

通过克隆对象,您就不会遇到我在上面创建的问题。Foo对象完全控制Car的生命周期。

编辑:它必须是一个虚函数,这样CarMotorBikeTruck可以根据它实际是什么对象做不同的事情。

因为您的第二个示例没有遵循三规则,因此如果复制Foo(例如,如果您在std::vector中使用Foo),则会崩溃。

在c++中,大多数时候你需要工作的复制构造函数,克隆是一个很好的方法。

想象一下:

Car *c = new Car();
Foo f1(c);
Foo f2(c);

…然后,当Foo的析构函数被调用时,你就可以看到烟火了。