我的书中涉及“虚拟副本构造函数”主题。该段说
构造函数不能是虚拟的,因此从技术上讲,不存在任何虚拟副本 构造函数。尽管如此,有时您的程序仍迫切需要能够传递 指向基础对象的指针,并具有创建的正确派生对象的副本。一种 解决此问题的常见方法是在基类中创建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, 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];
}
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()
方法,它与虚拟副本构造函数有关。谢谢。