C++ 中的虚拷贝构造函数


在深入探讨主题之前,让我们复习一下所有相关的术语。

拷贝构造函数是一种特殊的构造函数,用于创建与传递的对象完全相同的对象。

虚函数是在父类中声明并在继承父类的子类中重新定义(重写)的成员函数。

通过使用虚拷贝构造函数,程序员能够在不知道对象确切数据类型的情况下创建对象。

在 C++ 编程语言中,拷贝构造函数用于创建从另一个对象复制的对象。但是,如果您希望程序在运行时决定创建的对象类型,即该对象类型是在运行时定义的,而不是在编译时定义的,并且基于用户为特定条件提供的某些输入。在这种情况下,我们需要一个具有某些特殊功能的拷贝构造函数来执行此操作。因此,为了做到这一点,声明了虚拷贝构造函数,它提供了实时克隆对象的功能。

让我们举个例子,假设我们有一个图形,需要使用程序计算其面积。但是对象的类型是在运行时定义的,它可以是正方形、矩形或圆形。因此,我们将使用一个虚拷贝构造函数,它将根据用户输入的类型复制对象。

为了使虚构造函数正常工作,在基类上定义了两种方法。

clone()
create()

拷贝构造函数使用虚克隆方法,而虚创建方法由默认构造函数用于创建虚构造函数。

示例

#include <iostream>
using namespace std;
class figure{
   public:
   figure() { }
   virtual
   ~figure() { }
   virtual void ChangeAttributes() = 0;
   static figure *Create(int id);
   virtual figure *Clone() = 0;
};
class square : public figure{
   public:
   square(){
      cout << "square created" << endl;
   }
   square(const square& rhs) { }
   ~square() { }
   void ChangeAttributes(){
      int a;
      cout<<"The side of square";
      cin>>a;
      cout<<"Area of square is "<<a*a;
   }
   figure *Clone(){
      return new square(*this);
   }
};
class circle : public figure{
   public:
   circle(){
      cout << "circle created" << endl;
   }
   circle(const circle& rhs) { }
   ~circle() { }
   void ChangeAttributes(){
      int r;
      cout << "enter the radius of the circle ";
      cin>>r;
      cout<<"the area of circle is "<<((3.14)*r*r);
   }
   figure *Clone(){
      return new circle(*this);
   }
};
class rectangle : public figure{
   public:
   rectangle(){
      cout << "rectangle created" << endl;
   }
   rectangle(const rectangle& rhs) { }
   ~rectangle() { }
   void ChangeAttributes(){
      int a ,b;
      cout<<"The dimensions of rectangle ";
      cin>>a>>b;
      cout<<"Area of rectangle is "<<a*b;
   }
   figure*Clone(){
      return new rectangle(*this);
   }
};
figure *figure::Create(int id){
   if( id == 1 ){
      return new square;
   }
   else if( id == 2 ){
      return new circle;
   }
   else{
      return new rectangle;
   }
}
class User{
   public:
   User() : figures(0){
      int input;
      cout << "Enter ID (1, 2 or 3): ";
      cin >> input;
      while( (input != 1) && (input != 2) && (input != 3) ){
         cout << "Enter ID (1, 2 or 3 only): ";
         cin >> input;
      }
      figures = figure::Create(input);
   }
   ~User(){
      if( figures ){
         delete figures;
         figures = 0;
      }
   }
   void Action(){
      figure *newfigure = figures->Clone();
      newfigure->ChangeAttributes();
      delete newfigure;
   }
   private:
   figure *figures;
};
int main(){
   User *user = new User();
   user->Action();
   delete user;
}

输出

Enter ID (1, 2 or 3): 2
circle created
enter the radius of the circle R 3
the area of circle is 28.26

更新于: 2019年10月16日

5K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告