虚函数、继承

好吧,真的是好久没写过这样的代码,弄得有些地方忘了......

在这里,如果要把子类“赋值”给基类,可以用指针、或者引用

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<fstream>
using namespace std;
class Book
{
public:
    Book(){}
    Book &operator=(Book &p)
    {
        Book *ch=&p;
        if(this!=&p)
        {
            *this=p;
        }
        return *this;
    }
    virtual ~Book(){};
    //virtual ostream &operator<<(ostream &os)const=0;
    virtual void display()=0;
    virtual string type()=0;
    virtual int gettol()=0;
    virtual bool push(string s)=0;
    virtual bool pop()=0;
};
class ST: public Book
{
private:
    vector<string>name;
public:
    ST():Book(){}
    string type()
    {
        string st="ST book";
        return st;
    }
    int gettol()
    {
        return name.size();
    }
    bool push(string s)
    {
        name.push_back(s);
        return true;
    }
    bool pop()
    {
        if(name.empty()) return false;
        vector<string>::iterator it=name.end()-1;
        name.erase(it);
        return true;
    }
    friend ostream &operator<<(ostream &os,ST &tmp)
    {
        vector<string>::iterator it=tmp.name.begin();
        os<<"Type: "<<tmp.type()<<endl<<"Total: "<<tmp.name.size()<<endl;
        for(;it!=tmp.name.end();it++)
        os<<"Book name: "<<*it<<endl;
        return os;
    }
    void display()
    {
        cout<<*this;
    }
    virtual ~ST(){};
};
class DZ: public Book
{
private:
    vector<string>name;
public:
    DZ():Book(){}
    string type()
    {
        string st="DZ book";
        return st;
    }
    int gettol()
    {
        return name.size();
    }
    bool push(string s)
    {
        name.push_back(s);
        return true;
    }
    bool pop()
    {
        if(name.empty()) return false;
        vector<string>::iterator it=name.end()-1;
        name.erase(it);
        return true;
    }
    friend ostream &operator<<(ostream &os,DZ &tmp)
    {
        vector<string>::iterator it=tmp.name.begin();
        os<<"Type: "<<tmp.type()<<endl<<"Total: "<<tmp.name.size()<<endl;
        for(;it!=tmp.name.end();it++)
        os<<"Book name: "<<*it<<endl;
        return os;
    }
    void display()
    {
        cout<<*this;
    }
    virtual ~DZ(){};
};
int main()
{
    //Book w;
    ST tmp;
    DZ tmp1;
    string s;
    cout<<"请输入实体书籍名称,输入“exit”结束输入"<<endl;
    while(cin>>s)
    {
        if(s=="exit") break;
        tmp.push(s);
    }
    cout<<"请输入电子书籍名称,输入“exit”结束输入"<<endl;
    while(cin>>s)
    {
        if(s=="exit") break;
        tmp1.push(s);
    }
    //ST *p=&tmp;
    //DZ *p1=&tmp1;
    Book &w=tmp;       //这里用的是引用
    Book &w1=tmp1;
    w.display();
    w1.display();
    w.pop();
    w1.pop();
    cout<<endl<<endl;
    w.display();
    w1.display();
    return 0;
}

  

posted @ 2014-10-31 14:31  紫忆  阅读(248)  评论(0编辑  收藏  举报