如何解决虚拟副本构造函数和克隆方法
构造函数不能是虚拟的,因此从技术上讲,不存在任何虚拟副本 构造函数。尽管如此,有时您的程序仍迫切需要能够传递 指向基础对象的指针,并具有创建的正确派生对象的副本。一种 解决此问题的常见方法是在基类中创建Clone()方法,并 使它成为虚拟的。 Clone()方法创建当前类的新对象副本 并返回该对象。
然后,本书给出了以下代码(我删除了与我的疑问无关的某些部分)。
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal() {}
Mammal (const Mammal & rhs);
virtual void Speak() const
{
cout << "Mammal speak!\n";
}
virtual Mammal* Clone()
{
return new Mammal(*this);
}
};
Mammal::Mammal (const Mammal & rhs)
{
cout << "Mammal copy Constructor\n";
}
class Dog : public Mammal
{
public:
Dog() {}
Dog (const Dog & rhs);
void Speak()const
{
cout << "Woof!\n";
}
virtual Mammal* Clone()
{
return new Dog(*this);
}
};
Dog::Dog(const Dog & rhs): Mammal(rhs)
{
cout << "Dog copy constructor...\n";
}
enum ANIMALS { MAMMAL,DOG};
const int NumAnimalTypes = 2;
int main()
{
Mammal* theArray[NumAnimalTypes];
Mammal* ptr;
int choice,i;
for ( i = 0; i<NumAnimalTypes; i++)
{
cout << "(1)dog (2)Mammal: ";
cin >> choice;
switch (choice)
{
case DOG: ptr = new Dog;
break;
default: ptr = new Mammal;
break;
}
theArray[i] = ptr;
}
Mammal* OtherArray[NumAnimalTypes];
for (i=0;i<NumAnimalTypes;i++)
{
theArray[i]->Speak();
OtherArray[i] = theArray[i]->Clone();
}
for (i=0;i<NumAnimalTypes;i++)
OtherArray[i]->Speak();
return 0;
}
输出:
(1)dog (2)Mammal: 1
(1)dog (2)Mammal: 2
Woof!
Mammal copy Constructor
Dog copy constructor...
Mammal speak!
Mammal copy Constructor
Woof!
Mammal speak!
使用clone()
方法背后没有确切的直觉。意思是我注释掉了上面代码中的clone()
函数部分,并将最后第六行更改为OtherArray[i] = theArray[i];
,我想这仍然可以执行实际的代码意图。
我的代码:
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal() {}
Mammal (const Mammal & rhs);
virtual void Speak() const
{
cout << "Mammal speak!\n";
}
/* virtual Mammal* Clone()
{
return new Mammal(*this);
} */
};
Mammal::Mammal (const Mammal & rhs)
{
cout << "Mammal copy Constructor\n";
}
class Dog : public Mammal
{
public:
Dog() {}
Dog (const Dog & rhs);
void Speak()const
{
cout << "Woof!\n";
}
/* virtual Mammal* Clone()
{
return new Dog(*this);
} */
};
Dog::Dog(const Dog & rhs): Mammal(rhs)
{
cout << "Dog copy constructor...\n";
}
enum ANIMALS { MAMMAL,i;
for ( i = 0; i<NumAnimalTypes; i++)
{
cout << "(1)dog (2)Mammal: ";
cin >> choice;
switch (choice)
{
case DOG: ptr = new Dog;
break;
default: ptr = new Mammal;
break;
}
theArray[i] = ptr;
}
Mammal* OtherArray[NumAnimalTypes];
for (i=0;i<NumAnimalTypes;i++)
{
theArray[i]->Speak();
OtherArray[i] = theArray[i];
}
for (i=0;i<NumAnimalTypes;i++)
OtherArray[i]->Speak();
return 0;
}
输出:
(1)dog (2)Mammal: 1
(1)dog (2)Mammal: 2
Woof!
Mammal speak!
Woof!
Mammal speak!
有人可以向我解释为什么以及在何处需要使用clone()
方法,它与虚拟副本构造函数有关。谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。