zoukankan      html  css  js  c++  java
  • C++虚复制构造函数,设置Clone()方法返回基类指针,并设置为虚函数

    构造函数不能是虚函数。但有时候确实需要能传递一个指向基类对象的指针,并且有已创建的派生类对象的拷贝。通常在类内部创建一个Clone()方法,并设置为虚函数。

    //Listing 12.11 Virtual copy constructor
    #include <iostream>
    using namespace std;
    
    class Mammal
    {
      public:
         Mammal():itsAge(1) { cout << "Mammal constructor...
    "; }
         virtual ~Mammal() { cout << "Mammal destructor...
    "; }
         Mammal (const Mammal & rhs);
         virtual void Speak() const { cout << "Mammal speak!
    "; }
         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...
    ";
    }
    
    class Dog : public Mammal
    {
      public:
        Dog() { cout << "Dog constructor...
    "; }
        virtual ~Dog() { cout << "Dog destructor...
    "; }
        Dog (const Dog & rhs);
        void Speak()const { cout << "Woof!
    "; }
        virtual Mammal* Clone() { return new Dog(*this); } // 这里!
    };
    
    Dog::Dog(const Dog & rhs):
    Mammal(rhs)
    {
       cout << "Dog copy constructor...
    ";
    }
    
    class Cat : public Mammal
    {
      public:
        Cat() { cout << "Cat constructor...
    "; }
        ~Cat() { cout << "Cat destructor...
    "; }
        Cat (const Cat &);
        void Speak()const { cout << "Meow!
    "; }
        virtual Mammal* Clone() { return new Cat(*this); }
    };
    
    Cat::Cat(const Cat & rhs):
    Mammal(rhs)
    {
       cout << "Cat copy constructor...
    ";
    }
    
    enum ANIMALS { MAMMAL, DOG, CAT};
    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 DOG:   ptr = new Dog;
                       break;
            case CAT:   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: 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!

  • 相关阅读:
    raw socket
    selenium and win32api
    linux ip
    network config
    grub paramiter & menu.list
    实用命令dd
    resin or tomcat .war e.g. note
    JSP 运行
    linux command screen
    docker interact example
  • 原文地址:https://www.cnblogs.com/findumars/p/3698133.html
Copyright © 2011-2022 走看看