用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。
#include <iostream>
using namespace std;
class Resume
{
public:
Resume() {}
~Resume() {}
virtual Resume* clone() = 0;
virtual void show() = 0;
protected:
char* name;
};
class ResumeA : public Resume
{
public:
ResumeA(const char* str)
{
if (str == NULL)
{
name = new char[1];
name[0] = '\0';
}
else
{
name = new char[strlen(str) + 1];
strcpy(name, str);
}
}
~ResumeA()
{
delete[] name;
}
ResumeA(const ResumeA& r)
{
name = new char[strlen(r.name) + 1];
strcpy(name, r.name);
}
ResumeA* ResumeA::clone()
{
return new ResumeA(*this);
}
void show()
{
cout << "ResumeA name: " << name << endl;
}
};
class ResumeB : public Resume
{
public:
ResumeB(const char* str)
{
if (str == NULL)
{
name = new char[1];
name[0] = '\0';
}
else
{
name = new char[strlen(str) + 1];
strcpy(name, str);
}
}
~ResumeB()
{
delete[] name;
}
ResumeB(const ResumeB& r)
{
name = new char[strlen(r.name) + 1];
strcpy(name, r.name);
}
ResumeB* ResumeB::clone()
{
return new ResumeB(*this);
}
void show()
{
cout << "ResumeB name: " << name << endl;
}
};
void test_01()
{
Resume* r1 = new ResumeA("A");
Resume* r2 = new ResumeB("B");
Resume* r3 = r1->clone();
Resume* r4 = r2->clone();
r1->show();
r2->show();
//删除r1,r2
delete r1;
delete r2;
r1 = r2 = NULL;
//深拷贝所以对r3,r4无影响
r3->show();
r4->show();
delete r3;
delete r4;
r3 = r4 = NULL;
}
int main()
{
test_01();
system("pause");
return 0;
}