#ifndef DECLARE_CLASS_H_
#define DECLARE_CLASS_H_
#include<iostream>
#include<string>
using std::string;
class abstr_emp
{
private:
string fname;
string lname;
string job;
public:
abstr_emp(void);
abstr_emp(const string &fn,const string &ln,const string &j);
virtual void ShowAll(void) const;
virtual void SetAll(void);
friend std::ostream & operator<<(std::ostream &os,const abstr_emp &e);
virtual ~abstr_emp(void)=0; //virtual base class
};
class employee:public abstr_emp
{
public:
employee(void);
employee(const string &fn,const string &ln,const string &j);
virtual void ShowAll(void) const;
virtual void SetAll(void);
};
class manager:virtual public abstr_emp
{
private:
int inchargeof;
protected:
int InChargeOf(void)const {return inchargeof;}
int &InChargeOf(void) {return inchargeof;}
public:
manager(void);
manager(const string &fn,const string &ln,const string &j,int ico=0);
manager(const abstr_emp &e,int ico);
manager(const manager &m);
virtual void ShowAll(void)const;
virtual void SetAll(void);
};
class fink:public virtual abstr_emp
{
private:
string reportsto;
protected:
const string ReportsTo(void)const {return reportsto;}
string &ReportsTo(void){return reportsto;}
public:
fink(void);
fink(const string &fn,const string &ln,const string &j,const string &rpo);
fink(const abstr_emp &e,const string &rpo);
fink(const fink &e);
virtual void ShowAll(void)const;
virtual void SetAll(void);
};
class highfink:public manager,public fink
{
public:
highfink();
highfink(const string &fn,const string &ln ,const string &j,const string &rpo,int ico);
highfink(const abstr_emp &e,const string &rpo,int ico);
highfink(const fink &f,int ico);
highfink(const manager &m,const string &rpo);
highfink(const highfink &h);
virtual void ShowAll(void)const;
virtual void SetAll(void);
};
#endif // DECLARE_CLASS_H_
#include<iostream>
#include"declare_class.h"
using std::cout;
using std::endl;
using std::cin;
//class base class
abstr_emp::abstr_emp(void):fname("none"),lname("none"),job("NULL")
{
}
abstr_emp::abstr_emp(const string &fn,const string &ln,const string &j)
:fname(fn),lname(ln),job(j)
{
}
void abstr_emp::ShowAll(void) const
{
cout<<"fname: "<<fname<<endl;
cout<<"lname: "<<lname<<endl;
cout<<"job : "<<job<<endl;
}
void abstr_emp::SetAll(void)
{
cout<<"Enter your fname: ";
cin.get();
getline(cin,fname);
cout<<"Enter your lname: ";
getline(cin,lname);
cout<<"Enter your job: ";
getline(cin,job);
}
std::ostream & operator<<(std::ostream &os,const abstr_emp &e)
{
cout<<"fname: "<<e.fname<<endl;
cout<<"lname: "<<e.lname<<endl;
cout<<"job : "<<e.job<<endl;
return os;
}
abstr_emp::~abstr_emp(void){} //virtual base class
//class employee
employee::employee(void):abstr_emp()
{
}
employee::employee(const string &fn,const string &ln,const string &j):abstr_emp(fn,ln,j)
{
}
void employee::ShowAll(void) const
{
abstr_emp::ShowAll();
}
void employee::SetAll(void)
{
abstr_emp::SetAll();
}
//class manager
manager::manager(void):abstr_emp(),inchargeof(0)
{
}
manager::manager(const string &fn,const string &ln,const string &j,int ico)
:abstr_emp(fn,ln,j),inchargeof(ico)
{
}
manager::manager(const abstr_emp &e,int ico):abstr_emp(e),inchargeof(ico)
{
}
manager::manager(const manager &m):abstr_emp(m),inchargeof(m.inchargeof)
{
}
void manager::ShowAll(void)const
{
abstr_emp::ShowAll();
cout<<"inchargeof: "<<InChargeOf()<<endl;
}
void manager::SetAll(void)
{
abstr_emp::SetAll();
cout<<"Enter the manager's inchargeof: ";
cin>>InChargeOf();
while(cin.get()!='\n')
continue;
}
//class fink
fink::fink(void):abstr_emp(),reportsto(0)
{
}
fink::fink(const string &fn,const string &ln,const string &j,const string &rpo)
:abstr_emp(fn,ln,j),reportsto(rpo)
{
}
fink::fink(const abstr_emp &e,const string &rpo):abstr_emp(e),reportsto(rpo)
{
}
fink::fink(const fink &e):abstr_emp(e),reportsto(e.reportsto)
{
}
void fink::ShowAll(void)const
{
abstr_emp::ShowAll();
cout<<"reportsto: "<<ReportsTo()<<endl;
}
void fink::SetAll(void)
{
abstr_emp::SetAll();
cout<<"Enter the reportsto: ";
getline(cin,reportsto);
}
//class highfink
highfink::highfink()
{
}
highfink::highfink(const string &fn,const string &ln ,const string &j,const string &rpo,int ico)
:abstr_emp(fn,ln,j),manager(fn,ln,j,ico),fink(fn,ln,j,rpo)
{
}
highfink::highfink(const abstr_emp &e,const string &rpo,int ico)
:abstr_emp(e),manager(e,ico),fink(e,rpo)
{
}
highfink::highfink(const fink &f,int ico):abstr_emp(f),manager(f,ico),fink(f)
{
}
highfink::highfink(const manager &m,const string &rpo):abstr_emp(m),manager(m),fink(m,rpo)
{
}
highfink::highfink(const highfink &h):abstr_emp(h),manager(h),fink(h)
{
}
void highfink::ShowAll(void)const
{
abstr_emp::ShowAll();
cout<<"inchargeof: "<<manager::InChargeOf()<<endl;
cout<<"reportsto : "<<fink::ReportsTo()<<endl;
}
void highfink::SetAll(void)
{
abstr_emp::SetAll();
cout<<"Enter the manager's inchargeof: ";
(cin>>InChargeOf()).get(); //數字字串混合輸入時注意清除換行符
cout<<"Enter the reportsto: ";
getline(cin,ReportsTo());
}
#include<iostream>
#include"declare_class.h"
using namespace std;
int main(void)
{
employee em("Trip","Harris","Trumper");
cout<<em<<endl;
em.ShowAll();
manager ma("Amorphia","Spindragon","Nuances",5);
cout<<endl<<ma<<endl<<endl;
ma.ShowAll();
fink fi("Matt","Oggs","Olier","Juno Barr");
cout<<endl<<fi<<endl<<endl;
fi.ShowAll();
std::cout<<endl;
highfink hf(ma,"Curly Kew");
hf.ShowAll();
cout<<"\nPress a key for next phase:\n";
cin.get();
//highfink hf2("Liu","Xiang","None","NULL",0);
highfink hf2; //為什么這個多重繼承不能使用默認建構式,程式此處崩潰?
hf2.SetAll(); //BUG! ????
cout<<"Using an abstr_emp *pointer:\n";
abstr_emp *tri[4]={&em,&fi,&hf,&hf2};
for(int i=0;i<4;i++)
{
tri[i]->ShowAll();
std::cout<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111478.html
標籤:基礎類
