virtual copy constructor(虚复制构造函数)

构造函数不能是虚函数,因此从技术上讲,不存在虚复制构造函数。然而有时候程序需要通过传递一个指向基类对象的指针,创建一个派生类对象的拷贝。对于这种问题,一种常见的解决办法是,在基类中创建一个Clone()方法,并将其设置为虚方法。Clone()方法创建当前类对象的一个拷贝并返回该拷贝。由于每个派生类都覆盖了Clone()方法,因此它将创建派生类对象的一个拷贝。

示例代码如下:

  1. #include <iostream>
  2. using namespace std;
  3. class Mammal
  4. {
  5. public:
  6.   Mammal():itsAge(1) { cout << " Mammal constructor.../n "; }
  7.   virtual ~Mammal() { cout << " Mammal destructor.../n "; }
  8.   Mammal(const Mammal & rhs);
  9.   virtual void Speak() const { cout << " Mammal Speak!/n "; }
  10.   virtual Mammal* Clone() { return new Mammal(*this); }
  11.   int GetAge() const { return itsAge; }
  12. protected:
  13.   int itsAge;
  14. };
  15. Mammal::Mammal(const Mammal & rhs):itsAge(rhs.GetAge())
  16. {
  17.   cout << " Mammal copy constructor.../n ";
  18. }
  19. class Dog : public Mammal
  20. {
  21. public :
  22.   Dog() { cout << " Dog constructors.../n "; }
  23.   virtual ~Dog() {  cout << " Dog destructor.../n "; }
  24.   Dog(const Dog & rhs);
  25.   void Speak()const { cout << " Woof!/n "; }
  26.   virtual Mammal* Clone() { return new Dog(*this); }
  27. };
  28. Dog::Dog(const Dog & rhs):
  29. Mammal(rhs)
  30. {
  31.   cout << " Dog copy constructor.../n ";
  32. }
  33. class Cat:public Mammal
  34. {
  35. public:
  36.   Cat() { cout << " Cat constructor.../n "; }
  37.   virtual ~Cat() { cout << " Cat destructors.../n "; }
  38.   Cat(const Cat & rhs);
  39.   void Speak()const { cout << " Meow!/n "; }
  40.   virtual Mammal* Clone() { return new Cat(*this); }
  41. };
  42. Cat::Cat(const Cat & rhs):
  43. Mammal(rhs)
  44. {
  45.   cout << " Cat copy constructor.../n ";
  46. }
  47. const int NumAnimalTypes=3;
  48. int main()
  49. {
  50.   Mammal *theArray[NumAnimalTypes];
  51.   Mammal *ptr;
  52.   int choice,i;
  53.   for (i=0;i<NumAnimalTypes;i++)
  54.   {
  55.     cout<< " (1)dog (2)cat (3)Mammal: ";
  56.     cin>> choice;
  57.     switch(choice)
  58.     {
  59.     case 1: ptr=new Dog;
  60.       break;
  61.     case 2: ptr=new Cat;
  62.       break;
  63.     default: ptr=new Mammal;
  64.       break;
  65.     }
  66.     theArray[i]=ptr;
  67.   }
  68.   Mammal* otherArray[NumAnimalTypes];
  69.   for (i=0;i<NumAnimalTypes;i++)
  70.   {
  71.     theArray[i]->Speak();
  72.     otherArray[i]=theArray[i]->Clone();
  73.   }
  74.   for(i=0;i<NumAnimalTypes;i++)
  75.     otherArray[i]->Speak();
  76.   return 0;
  77. }
  78. //输出:
  79. // (1)dog (2)cat (3)Mammal: 1
  80. // Mammal constructor...
  81. //  Dog constructors...
  82. //  (1)dog (2)cat (3)Mammal: 2
  83. // Mammal constructor...
  84. //  Cat constructor...
  85. //  (1)dog (2)cat (3)Mammal: 3
  86. // Mammal constructor...
  87. //  Woof!
  88. //  Mammal copy constructor...
  89. //  Dog copy constructor...
  90. //  Meow!
  91. //  Mammal copy constructor...
  92. //  Cat copy constructor...
  93. // Mammal Speak!
  94. //  Mammal copy constructor...
  95. //  Woof!
  96. //  Meow!
  97. //  Mammal Speak!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值