有关字符串的C++问题,如何正确求解

试定义CString和CString的子类CString2(可对CString声明做少量调整),CString,CString2声明如下:

class CString
{
 char *str;    //字符串
public:
 CString();    //构造函数
 CString(const char s[]);  //构造函数
 CString(CString&t);  //拷贝构造函数
 ~CString();
 int Set(const char s[]);  //
 void Print();   //输出
};

class CString2 :public CString
{
public:
 CString2();    //构造函数
 CString2(const char s[]);  //构造函数
 CString2(CString2& t);  //拷贝构造函数
 CString2 &Cat(CString2&t);   //字符串连接
 int Cmp(CString2& t);        //字符串比较
};

在如下主函数中对该类进行测试。

int main() {
 char s0[100], s1[100];
 cin >> s0 >> s1;
 CString2 cs0(s0),cs1(cs0);
 cs0.Set(s1);
 cout << cs0.Cmp(cs1) << endl;
 CString2 &t=cs0.Cat(cs1);
 t.Print();
 return 0;
}

输入输出示意如下:
ASDF BSDF
1
BSDFASDF
请在答题窗口录入编写的完整程序。


#pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”
#include <iostream>
#include <string.h>
using namespace std;
class CString {
public:
    char *str;                 //字符串
public:
    CString();                 //构造函数
    CString(const char s[]);   //构造函数
    CString(CString& t);       //拷贝构造函数
    ~CString();
    int Set(const char s[]);   //
    void Print();              //输出
};
class CString2 :public CString {
public:
    CString2();                //构造函数
    CString2(const char s[]);  //构造函数
    CString2(CString2& t);     //拷贝构造函数
    CString2& Cat(CString2& t);//字符串连接
    int Cmp(CString2& t);      //字符串比较
};
CString::CString() {
    str=NULL;
}
CString::CString(const char s[]) {
    str=(char *)s;
}
CString::CString(CString& t) {
    str=t.str;
}
CString::~CString() {
    str=NULL;
}
int CString::Set(const char s[]) {
    str=(char *)s;
    return 0;
}
void CString::Print() {
    cout << str;
}
CString2::CString2() {
    str=NULL;
}
CString2::CString2(const char s[]) {
    str=(char *)s;
}
CString2::CString2(CString2& t) {
    str=(char *)(t.str);
}
CString2& CString2::Cat(CString2& t) {
    str=strcat(str,t.str);
    return *this;
}
int CString2::Cmp(CString2& t) {
    int r=strcmp(str,t.str);
    if (r!=0) r=1;
    return r;
}
int main() {
    char s0[100], s1[100];
    cin >> s0 >> s1;
    CString2 cs0(s0),cs1(cs0);
    cs0.Set(s1);
    cout << cs0.Cmp(cs1) << endl;
    CString2 &t=cs0.Cat(cs1);
    t.Print();
    return 0;
}
//输入
//ASDF BSDF
//输出
//1
//BSDFASDF

img