. 定义一个基类 BaseString,实现基本的输入字符串的功能。 //-------------------------------------------------------------------------------------------------- class BaseString { public: char *GetData();//返回字符串 void Input(); //输入字符串,遇到换行符结束 void Display();//显示字符串 BaseString(); ~BaseString(); unsigned int Getlength(){ return Length;}//获取字符串长度 protected: char Data[1024]; unsigned Length; //表示字符串的长度,不包括结束的'\0' }; //-------------------------------------------------------------------------------------------------- 2. 定义一个类 ReString,公有继承自 BaseString,添加一个函数 Reverse()实 现字符串的倒置功能,即:将对象中的数据成员 Data 数组的元素倒置。倒置的概 念是:原字符串为“abcd1234”,倒置后为“4321dcba”。 3. 定义一个类 CopyString,公有继承自 BaseString,添加一个函数 Copy()实现 字符串的拷贝功能(传入的参数可以是一个字符串对象,也可以从一个字符串常量, 将参数中的字符串拷贝到对象的 Data 数组中去,注意:不要使用系统内置的 strcpy() 函数)。 面向对象程序设计上机指导 20 4. 定义一个类 CmpString,公有继承自 BaseString,添加一个函数 Compare() 实现字符串的比较功能(传入的参数可以是一个字符串对象,也可以从一个字符串 常量,将参数中的字符串同对象中的 Data 进行比较)。 思考字符串比较的算法。注意:不要使用系统内置的 strcmp()函数。 5. 在 main()函数中体现出派生类的构造函数的调用次序。可以在各类的构 造函数中输出“I am the * class’s constructor”。*表示当前类名。 6. 定义一个类 NewString 继承自 ReString、CopyString 和 CmpString 三个类, 在程序中体现出多重继承中的基类的继承程序。为基类 BaseString 增加功能: ToUpper()函数将所有字母大写,ToLower()函数将所有字母小写。并在继承的过程 中声明为虚基类,比较 BaseString 作为虚基类和非虚基类的情况下的区别
时间: 2023-08-15 17:13:03 浏览: 81
以下是实现代码:
```c++
#include <iostream>
#include <cstring>
#include <ctype.h>
using namespace std;
class BaseString {
public:
char *GetData() { return Data; }
void Input() { cin.getline(Data, 1024); Length = strlen(Data); }
void Display() { cout << Data << endl; }
BaseString() { cout << "I am the BaseString's constructor" << endl; }
~BaseString() {}
unsigned int Getlength() { return Length; }
protected:
char Data[1024];
unsigned Length;
};
class ReString : public BaseString {
public:
ReString() { cout << "I am the ReString's constructor" << endl; }
~ReString() {}
void Reverse() {
int len = Length - 1;
for (int i = 0; i < len / 2; i++) {
swap(Data[i], Data[len - i - 1]);
}
}
};
class CopyString : public BaseString {
public:
CopyString() { cout << "I am the CopyString's constructor" << endl; }
~CopyString() {}
void Copy(char* str) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
Data[i] = str[i];
}
Length = len;
}
void Copy(BaseString *str) {
int len = str->Getlength();
for (int i = 0; i < len; i++) {
Data[i] = str->GetData()[i];
}
Length = len;
}
};
class CmpString : public BaseString {
public:
CmpString() { cout << "I am the CmpString's constructor" << endl; }
~CmpString() {}
int Compare(char* str) {
int len = strlen(str);
int minLen = (len < Length) ? len : Length;
for (int i = 0; i < minLen; i++) {
if (Data[i] < str[i]) return -1;
else if (Data[i] > str[i]) return 1;
}
if (Length == len) return 0;
else if (Length < len) return -1;
else return 1;
}
int Compare(BaseString *str) {
int len = str->Getlength();
int minLen = (len < Length) ? len : Length;
for (int i = 0; i < minLen; i++) {
if (Data[i] < str->GetData()[i]) return -1;
else if (Data[i] > str->GetData()[i]) return 1;
}
if (Length == len) return 0;
else if (Length < len) return -1;
else return 1;
}
};
class NewString : public ReString, public CopyString, virtual public CmpString {
public:
NewString() { cout << "I am the NewString's constructor" << endl; }
~NewString() {}
void ToUpper() {
int len = Length;
for (int i = 0; i < len; i++) {
Data[i] = toupper(Data[i]);
}
}
void ToLower() {
int len = Length;
for (int i = 0; i < len; i++) {
Data[i] = tolower(Data[i]);
}
}
};
int main() {
NewString str;
str.Input();
str.Reverse();
str.Display();
char test[] = "test string";
CopyString copyStr;
copyStr.Copy(test);
copyStr.Display();
copyStr.Copy(&str);
copyStr.Display();
char test2[] = "abcd1234";
CmpString cmpStr;
cmpStr.Copy(test2);
cmpStr.Display();
cout << cmpStr.Compare(&str) << endl;
cout << cmpStr.Compare(test2) << endl;
str.ToUpper();
str.Display();
str.ToLower();
str.Display();
return 0;
}
```
在这个程序中,我们定义了一个基类 BaseString,并且定义了四个派生类 ReString、CopyString、CmpString 和 NewString。其中,ReString 继承自 BaseString,并且添加了 Reverse() 函数,用来实现字符串的倒置功能;CopyString 继承自 BaseString,并且添加了 Copy() 函数,用来实现字符串的拷贝功能;CmpString 继承自 BaseString,并且添加了 Compare() 函数,用来实现字符串的比较功能;NewString 继承自 ReString、CopyString 和 CmpString,同时也继承了 BaseString。在 NewString 中,我们还添加了 ToUpper() 和 ToLower() 函数,用来将字符串中的字母转换为大写或小写。
注意,在 NewString 中,我们将 CmpString 继承声明为 virtual,这是因为 CmpString 和 CopyString 都继承自 BaseString,而 NewString 又同时继承了 CmpString 和 CopyString,这就会导致 BaseString 被继承了两次。如果不将 CmpString 的继承声明为 virtual,则 NewString 中会包含两个 BaseString 对象,这就会导致一些问题。通过将 CmpString 的继承声明为 virtual,我们可以保证只有一个 BaseString 对象被 NewString 继承。
在 main() 函数中,我们创建了一个 NewString 对象,并且演示了各个派生类的功能。同时,我们也体现了派生类的构造函数的调用顺序。
阅读全文