请打开考生文件夹下的解决方案文件proj3,其中该工程中包含定义了用于表示姓名的抽象类Name、表示“先名后姓”的姓名类Name1(名、姓之间用空格隔开)和表示“先姓后名”的姓名类Name2(姓、名之间用逗号隔开);程序应当显示:John SmithSmith,John但程序中有缺失部分,请按照以下提示,把缺失部分补充完整:(1)在“//**1** ****found ****”的下方是函数show中的一个语句,它按先名后姓的格式输出姓名。(2)在“//**2** ****found ****”的下方是函数getWord中的一个语句,它把一个字符序列复制到head所指向的字符空间中,复制从start所指向的字符开始,共复制end - start个字符。(3)在“//**3** ****found ****”的下方是函数createName中的语句,它根据指针p的值决定返回何种对象:如果p为空,直接返回一个Name1对象,否则直接返回一个Name2对象。注意:返回的 Name1或Name2对象必须是动态对象,返回的实际是指向它的指针。注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“****found****”。填写的内容必须在一行中完成,否则评分将产生错误。//proj3.cpp#include < iostream >using namespace std;class Name {protected:char * surname; //姓char * firstname; //名public:~Name () { delete[ ] surname; delete[ ] firstname; }virtual void show () =0;}; class Name1: public Name {public:Name1(const char * name);// **1** ******* found *******void show () { ________; }};class Name2: public Name{public:Name2(const char * name);void show (){ cout << surname << ‘,’ << firstname; }};char * getWord(const char * start, const char * end){char * head = new char[end-start +1];// **2** ******* found *******for(int i =0;i﹤end-start; i ++)________;head[end-start]= ‘\0’;return head;}Namel:: Name1(const char * name){char *p=strchr(name, ‘’);firstname = getWord(name,p);surname = new char[strlen(P)];strcpy(surname, p +1);}Name2:: Name2 (const char * name){char * p = strchr(name, ‘,’);surname = getWord(namef p);firstname = new char[strlen(P)];strcpy(firstname, p +1);}Name * createName(const char *s){char * p = strchr (s, ‘,’);// **3** ******* found *******if(p) ________;}int main (){Name * n;n = createName(“John Smith”);n -> show (); cout << endl;delete n;n = createName(“Smith, John”);n -> show(); cout << endl;delete n;return 0;}