构造函数不能是虚函数,因此从技术上讲,不存在虚复制构造函数。然而有时候程序需要通过传递一个指向基类对象的指针,创建一个派生类对象的拷贝。对于这种问题,一种常见的解决办法是,在基类中创建一个Clone()方法,并将其设置为虚方法。Clone()方法创建当前类对象的一个拷贝并返回该拷贝。由于每个派生类都覆盖了Clone()方法,因此它将创建派生类对象的一个拷贝。
示例代码如下:
- #include <iostream>
- using namespace std;
- class Mammal
- {
- public:
- Mammal():itsAge(1) { cout << " Mammal constructor.../n "; }
- virtual ~Mammal() { cout << " Mammal destructor.../n "; }
- Mammal(const Mammal & rhs);
- virtual void Speak() const { cout << " Mammal Speak!/n "; }
- virtual Mammal* Clone() { return new Mammal(*this); }
- int GetAge() const { return itsAge; }
- protected:
- int itsAge;
- };
- Mammal::Mammal(const Mammal & rhs):itsAge(rhs.GetAge())
- {
- cout << " Mammal copy constructor.../n ";
- }
- class Dog : public Mammal
- {
- public :
- Dog() { cout << " Dog constructors.../n "; }
- virtual ~Dog() { cout << " Dog destructor.../n "; }
- 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 ";
- }
- class Cat:public Mammal
- {
- public:
- Cat() { cout << " Cat constructor.../n "; }
- virtual ~Cat() { cout << " Cat destructors.../n "; }
- Cat(const Cat & rhs);
- void Speak()const { cout << " Meow!/n "; }
- virtual Mammal* Clone() { return new Cat(*this); }
- };
- Cat::Cat(const Cat & rhs):
- Mammal(rhs)
- {
- cout << " Cat copy constructor.../n ";
- }
- const int NumAnimalTypes=3;
- int main()
- {
- Mammal *theArray[NumAnimalTypes];
- Mammal *ptr;
- int choice,i;
- for (i=0;i<NumAnimalTypes;i++)
- {
- cout<< " (1)dog (2)cat (3)Mammal: ";
- cin>> choice;
- switch(choice)
- {
- case 1: ptr=new Dog;
- break;
- case 2: ptr=new Cat;
- 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)cat (3)Mammal: 1
- // Mammal constructor...
- // Dog constructors...
- // (1)dog (2)cat (3)Mammal: 2
- // Mammal constructor...
- // Cat constructor...
- // (1)dog (2)cat (3)Mammal: 3
- // Mammal constructor...
- // Woof!
- // Mammal copy constructor...
- // Dog copy constructor...
- // Meow!
- // Mammal copy constructor...
- // Cat copy constructor...
- // Mammal Speak!
- // Mammal copy constructor...
- // Woof!
- // Meow!
- // Mammal Speak!