c++实现字符串的基本功能(派生类与继承)
- 定义一个基类 BaseString,实现基本的输入字符串的功能。
- 定义一个类继承自 BaseString,实现字符串的倒置功能。
- 定义一个类继承自 BaseString,实现字符串的 copy 功能。
- 定义一个类继承自 BaseString,实现字符串的 compare 功能。
- 将基类 BaseString 的Disp()函数定义为虚函数,解决基类继承中产生的二义性问题
#include<iostream>
#include<string>
using namespace std;
class BaseString{
public:
char* GetData();
void Input();
virtual void Disp();
BaseString();
unsigned Getlength(){
return Length;
}
protected:
char Data[10];
unsigned Length;
};
BaseString::BaseString(){
Data[0]='\0';
Length=0;
}
char* BaseString::GetData(){
return Data;
}
void BaseString::Input(){
cout<<"请输入一个字符串";
cin.getline(Data,10);
for(Length=0;Data[Length]!='\0';Length++);
}
void BaseString::Disp(){
cout<<"该字符串为: "<<Data<<endl;
}
class ReString:public BaseString{
protected:
public:
void Reverse()
{
char temp;
int iMax=Length-1;
for(int i=0;i<=iMax/2;i++)
temp=Data[i],
Data[i]=Data[iMax-i],
Data[iMax-i]=temp;
}
void Disp(){
cout<<"倒置字符串为: "<<Data<<endl;
}
};
class CopyString:public BaseString{
public:
void Copy(BaseString a)
{
char *temp=a.GetData();
int i;
for(i=0;i<a.Getlength();i++)
Data[i]=temp[i];
Data[i]='\0';
Length=a.Getlength();
}
};
class ComString:public BaseString{
public:
int Com(BaseString bs)
{
int i;
for(i=0;Data[i]!='\0'&&bs.GetData()[i]!='\0'&&Data[i]==bs.GetData()[i];i++);
if(Data[i]=='\0'&&bs.GetData()[i]!='\0') return -1;
else if(Data[i]!='\0'&&bs.GetData()[i]=='\0') return 1;
else if(Data[i]=='\0'&&bs.GetData()[i]=='\0') return 0;
else if(Data[i]>bs.GetData()[i]) return 1;
else return -1;
}};
void main(){
BaseString a;
a.Input();
cout<<"字符串长度为: ";
cout<<a.Getlength()<<endl;
a.Disp();
ReString b;
b.Input();
b.Reverse();
cout<<"字符串长度为: ";
cout<<b.Getlength()<<endl;
b.Disp();
CopyString c;
c.Copy(a);
cout<<"复制后字符串: ";
c.Disp();
ComString d;
d.Input();
d.Com(a);
cout<<"字符串长度为: ";
cout<<d.Getlength()<<endl;
c.Disp();cout<<"与第一个字符串比较结果为"<<d.Com(a)<<endl;
}
注意点:
1. 在基类的派生类中,可以直接定义新的功能。并且能共继续使用基类的函数。
2. 基类定义时,Getdata()的返回值一定要为字符串类型,要区分Getdata()与Disp()的区别。
3. 比较类中,利用循环找到第一个不相同的字符,再进行分类讨论,输出结果。