本文章分为知识点、例子和心得
基础知识:
- 继承:在已有类的基础上创建新类的过程
- 不论种方式继承基类,派生类都不能直接使用基类的私有成员
- 派生类的生成过程经历了三个步骤:1.吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
2.改造基类成员
3.添加派生类新成员 - (1) 吸收基类成员:在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
(2) 改造基类成员:通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
(3) 添加新成员:仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。

例子:
例1:12306列车时刻查询系统中的部分:
class InformationS//基类,给Station和Train
{
protected:
int InfNum;
vector<Information>base;
vector<Information>::iterator it;
public:
InformationS(){InfNum=0;}
int getInfNum(){return InfNum;}
Time getStartTime(int a){return base[a].getT1();}
Time getEndTime(int a){return base[a].getT2();}
string getNumber(int a){return base[a].getTrainNumber();}
void setInfNum(int a){InfNum=a;}
vector<Information> getInf(){return base;}
void displayBase(int a)
{
cout<<base[a]<<endl;
}
int getSize(){return base.size();}
void displayAllInf()
{
for(int i=0;i<base.size();i++)cout<<base[i]<<endl;
}
};
class Station:public InformationS//站点
{
private:
string name;//站点名称
multimap<string,int>map;//经过的车次向量(元素为列车信息)
multimap<string,int>::iterator mit;
public:
Station(){}
Station(string a):name(a){}
string getName(){return name;}
void setName(string a){name=a;}
void addInf(Information i)
{
InfNum+=1;
base.push_back(i);
map.insert(make_pair(i.getName(),base.size()-1));
}
void addInf(string a,string b,Time c,Time d)
{
Information i(a,b,c,d);
InfNum+=1;
base.push_back(i);
map.insert(make_pair(i.getName(),base.size()-1));
}
int SearchInf(string number)
{
mit=map.find(number);
if(mit!=map.end()) return mit->second;
else return -1;
}
void setTime(string number,Time t1,Time t2)
{
int a=SearchInf(number);
base[a].setTime(t1,t2);
}
friend istream&operator>>(istream&is,Station&s)
{
is>>s.name;
if(s.name=="-1") return is;//改
is>>s.InfNum;
Information i;
s.base.clear();
for(int a=0;a<s.InfNum;a++)
{
is>>i;
s.base.push_back(i);
s.map.insert(make_pair(i.getTrainNumber(),s.base.size()-1));
}
return is;
}
friend ostream&operator<<(ostream&os,const Station&s)
{
os<<s.name<<" "<<s.InfNum<<endl;
for(int a=0;a<s.InfNum;a++)
{
os<<s.base[a]<<endl;
}
return os;
}
};
class Train:public InformationS//车次
{
private:
string number;//车次编号 例:A0001,有字母
string start;//始发站
string end;//终点站
multimap<string,int>map;//经过的站点向量(元素为列车信息)
multimap<string,int>::iterator mit;
public:
Train(){number="-1";}
Train(string a,string b,string c):number(a),start(b),end(c){}
string getNumber(){return number;}
string getStart(){return start;}
string getEnd(){return end;}
void setNumber(string a){number=a;}
void setStart(string a){start=a;}
void setEnd(string a){end=a;}
int SearchInf(string name)
{
mit=map.find(name);
if(mit!=map.end()) return mit->second;
else return -1;
}
void setTime(string name,Time t1,Time t2)
{
int a=SearchInf(name);
base[a].setTime(t1,t2);
}
void addInf(Information i)
{
InfNum+=1;
base.push_back(i);
map.insert(make_pair(i.getName(),base.size()-1));
}
void addInf(string a,string b,Time c,Time d)
{
Information i(a,b,c,d);
base.push_back(i);
map.insert(make_pair(i.getName(),base.size()-1));
InfNum+=1;
}
void DeleteInf(string a)
{
int b=SearchInf(a);
base.erase(base.begin()+b);
map.erase(a);
InfNum--;
}
friend istream&operator>>(istream&is,Train&t)
{
is>>t.number;
if(t.number=="-1") return is;//改
is>>t.start>>t.end>>t.InfNum;
Information i;
t.base.clear();
for(int a=0;a<t.InfNum;a++)
{
is>>i;
t.base.push_back(i);
t.map.insert(make_pair(i.getName(),t.base.size()-1));
}
return is;
}
friend ostream&operator<<(ostream&os,const Train&t)
{
if(t.number=="-1")
{
os<<"-1"<<endl;return os;
}
os<<t.number<<" "<<t.start<<" "<<t.end<<" "<<t.InfNum<<endl;
for(int a=0;a<t.InfNum;a++)
{
os<<t.base[a]<<endl;
}
return os;
}
};
心得:
继承很好用,可以省代码,节省功夫
最好别先写基类,就怕写完了忘了写啥还老翻回去找,最好等写完了再提取相同部分