[C++] 继承

本文章分为知识点、例子和心得

基础知识:

  • 继承:在已有类的基础上创建新类的过程
  • 不论种方式继承基类,派生类都不能直接使用基类的私有成员
  • 派生类的生成过程经历了三个步骤: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;
    }
};

心得:

继承很好用,可以省代码,节省功夫

最好别先写基类,就怕写完了忘了写啥还老翻回去找,最好等写完了再提取相同部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值