我刚读了虚构造函数和克隆函数的概念。
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
将无法访问它认为持有的相同资源
这不是问题吗?
答案 0 :(得分:1)
管理类实例拥有的资源的问题并不是这种情况所独有的。它必须在复制构造函数和赋值运算符中处理。
可以通过各种方式处理:
答案 1 :(得分:0)
在foo里面,c指向一个指向同一资源的克隆对象
事实并非如此。默认的复制构造函数将复制所有非静态元素,并且您没有。您的类中有0个变量,因此您的复制构造函数将不执行任何操作。
所以,在这个函数中:
void foo(Dog* p)
{
Dog* c= p->clone();
}
c
不会指向同一个对象,除非您在Dog
内定义了指针,并且在某些时候没有正确克隆。
具有讽刺意味的是,你的对象是空的。因此,除非你在类中引入一些变量,否则我们在这里和那里讨论空对象,因此浅层和深层复制是没有意义的。