虚拟CTOR的克隆功能实现是否有问题

时间:2017-07-20 07:13:05

标签: c++ clone

我刚读了虚构造函数和克隆函数的概念。

class Dog
{
public:
    virtual Dog* clone()
    {
        return (new Dog(*this));
    }
};
class YellowDog:public Dog
{
public:
    virtual YellowDog* clone()
    {
        return (new YellowDog(*this)); //default Copy ctor is shallow copy. 
    }
};

void foo(Dog* p)
{
    Dog* c= p->clone(); 
}

int main()
{
    YellowDog d;
    foo(&d);
}

上面的代码是否有问题? 假设在main中创建的YellowDog d持有资源。 在foo内,c将指向一个指向同一资源的克隆对象。 因此,如果我们在delete上调用c,那么main中的YellowDog d将无法访问它认为持有的相同资源 这不是问题吗?

2 个答案:

答案 0 :(得分:1)

管理类实例拥有的资源的问题并不是这种情况所独有的。它必须在复制构造函数和赋值运算符中处理。

可以通过各种方式处理:

  1. 您可以通过使这些功能无法访问来禁止复制。但它也意味着删除了clone()函数。
  2. 您可以使用显式共享。每个副本共享相同的资源,最后一个要销毁的资源释放资源。这意味着你必须设置一些引用计数机制。
  3. 您可以复制资源。如果资源是唯一且无法复制,则并非总是如此。

答案 1 :(得分:0)

  

在foo里面,c指向一个指向同一资源的克隆对象

事实并非如此。默认的复制构造函数将复制所有非静态元素,并且您没有。您的类中有0个变量,因此您的复制构造函数将不执行任何操作。

所以,在这个函数中:

void foo(Dog* p)
{
    Dog* c= p->clone(); 
}

c不会指向同一个对象,除非您在Dog内定义了指针,并且在某些时候没有正确克隆。

具有讽刺意味的是,你的对象是空的。因此,除非你在类中引入一些变量,否则我们在这里和那里讨论空对象,因此浅层和深层复制是没有意义的。