C++學習———–虛基類的MI

來源:互聯網
上載者:User
 
/***************************************************************************注意,該類階層使用了帶虛基類的MI,所以要牢記這種情況下用於構造化列表的特規則。還需要注意的是,有些方法被聲明為保護的。這可以簡單化一些highfink方法的代碼(例如,如果highfink::ShowAll()只是調用fink::ShowAll()和manager::ShowAll(),則它將調用abstr_emp::ShowAll()兩次)。請提供類方法的實現,並在一個程式中對這些類方法進行測試。下面是一個小型測試程式:***************************************************************************//***************************************************************************useemp.cpp功能:提供測試程式備忘:無****************************************************************************/#include<iostream>using namespace std ;#include"emp.h"int main(void){employee em("Trip" ,"Harris","Thumper") ;cout << em << endl ;em.ShowAll() ;cout << endl ;manager ma("Amorphia" , "Spindragon" , "Nuancer" ,5 ) ;cout << ma << endl ;ma.ShowAll () ;cout << endl ;fink fi("Matt" ,"Oggs" ,"Oiler","Juno Barr" ) ;cout << fi << endl ;fi.ShowAll () ;cout << endl ;highfink hf(ma,"Curly Kew") ;hf.ShowAll () ;cout << "Press a key for nex phase : \n" ;cin.get() ;while((cin.get()) != '\n')continue ;highfink hf2 ;hf2.SetAll() ;cout << "Using an abstr_emp * pointer : \n" ;abstr_emp *tri[4] = {&em , &fi , &hf ,&hf2} ;cout << endl ;for(int i = 0 ; i < 4 ; i++){tri[i]->ShowAll() ;cout << endl ;}return 0 ;}/*********************************************************emp.h  功能:提供一些類聲明  備忘:**********************************************************/#ifndef EMP_H_#define EMP_H_#include<iostream>#include<string>//class abstr_empclass abstr_emp{private :std::string fname ;std::string lname ;std::string job ;public :abstr_emp() ;abstr_emp(const std::string &fn , const std::string &ln,const std::string &j) ;virtual void ShowAll() const ;virtual void SetAll() ;friend std::ostream & operator<<(std::ostream &os, const abstr_emp &e) ;virtual ~abstr_emp() = 0 {}} ;//class employeeclass employee : public abstr_emp{public :employee() ;employee(const std::string &fn , const std::string &ln ,const std::string &j) ;virtual void ShowAll() const ;virtual void SetAll() ;} ;//class managerclass manager: virtual public abstr_emp{private :int inchargeof ;protected :int InChargeOf() const {return inchargeof ;}int & InChargeOf() {return inchargeof ;} public :manager() ;manager(const std::string &fn ,const std::string &ln ,const std::string &j ,int ico = 0 ) ;manager(const abstr_emp &e ,int ico) ;manager(const manager &m) ;virtual void ShowAll() const ;virtual void SetAll() ;} ;//class finkclass fink:virtual public abstr_emp {private :std::string reportsto ;protected : const std::string  ReportsTo() const {return reportsto ;} std::string  &ReportsTo() {return reportsto ;}public :fink() ;fink(const std::string &fn ,const std::string &ln,const std::string &j ,const std::string &rpo) ;fink(const abstr_emp &e,const std::string &rpo) ;fink(const fink &e ) ;virtual void ShowAll() const ;virtual void SetAll() ;} ;//class highfinkclass highfink:public manager ,public fink {public :highfink() ;highfink(const std::string &fn ,const std::string &ln,const std::string &j,const std::string &rpo,int ico) ;highfink(const abstr_emp &e , const std::string &rpo ,int ico) ;highfink(const fink &f ,int ico) ;highfink(const manager &m ,const std::string &rpo) ;highfink(const highfink &h) ;virtual void ShowAll() const ;virtual void SetAll() ;} ;#endif/**********************************************************emp.cpp  功能:提供類方法的實現  備忘:帶虛基類的MI,建構函式的規則有變(包括複製建構函式)而且在Show()之類的方法,思路應該要轉變,否則會調用兩次。**********************************************************/#include"emp.h"using namespace std ;//class abstr_emp methods ostream & operator<<(ostream &os, const abstr_emp &e){e.ShowAll () ;return os ;}void abstr_emp::SetAll () {cout << "Enter the first name : "  ;getline(cin,fname) ;cout << "Enter the last name : " ;getline(cin,lname) ;cout << "Enter the job : " ;getline(cin,job) ;while((cin.get()) != '\n')continue ;} void abstr_emp::ShowAll () const {cout << fname << " , " << lname << endl ;cout <<"Job : " << job << endl ;}abstr_emp::abstr_emp(const std::string &fn , const std::string &ln,const std::string &j):fname(fn) ,lname(ln),job(j) {}abstr_emp::abstr_emp(){}//class  employee methodsvoid employee::SetAll(){abstr_emp::SetAll () ;}void employee::ShowAll () const {abstr_emp::ShowAll () ;}employee::employee(const std::string &fn , const std::string &ln ,const std::string &j):abstr_emp(fn,ln,j) {}employee::employee():abstr_emp(){} //class  manager methods void manager::SetAll (){abstr_emp::SetAll () ;cout << "Enter the inchargeof : " ;cin >> inchargeof ;}void manager::ShowAll () const {abstr_emp::ShowAll () ;cout << "Inchargeof : " << inchargeof << endl ; }manager::manager(const manager &m):abstr_emp(m) {inchargeof = m.inchargeof ;}manager::manager(const abstr_emp &e ,int ico):abstr_emp(e){inchargeof = ico ;}manager::manager(const std::string &fn ,const std::string &ln ,const std::string &j ,int ico ):abstr_emp(fn,ln,j){inchargeof = ico ;}manager::manager():abstr_emp(){}//class fink methodvoid fink::SetAll(){abstr_emp::SetAll () ;cout << "Enter the reportsto : " ;cin >> reportsto ;}void fink::ShowAll() const {abstr_emp::ShowAll () ;cout << "reportsto : " << reportsto << endl ;}fink::fink(const fink &e):abstr_emp(e){reportsto = e.reportsto ;}fink::fink(const abstr_emp &e,const std::string &rpo):abstr_emp(e),reportsto(rpo){}fink::fink(const std::string &fn ,const std::string &ln,const std::string &j ,const std::string &rpo):abstr_emp(fn,ln,j),reportsto(rpo){}fink::fink():abstr_emp(){}//class highfink methodsvoid highfink::SetAll (){abstr_emp::SetAll () ;cout << "Enter the inchargeof : " ;cin >> InChargeOf() ;cout << "Enter the reportsto : " ;cin >> ReportsTo() ;}void highfink::ShowAll() const {abstr_emp::ShowAll () ;cout << "InChargeOf : " << InChargeOf() << endl ;cout << "ReportsTo : " << ReportsTo() << endl ;}highfink::highfink(const highfink &h):abstr_emp(h),manager(h),fink(h){}highfink::highfink(const manager &m ,const std::string &rpo):abstr_emp(m),manager(m),fink(m,rpo){}highfink::highfink(const fink &f ,int ico):abstr_emp(f),fink(f),manager(f,ico){}highfink::highfink(const abstr_emp &e , const std::string &rpo ,int ico):abstr_emp(e),manager(e,ico),fink(e,rpo){}highfink::highfink(const std::string &fn ,const std::string &ln,const std::string &j,const std::string &rpo,int ico):abstr_emp(fn,ln,j),manager(fn,ln,j,ico),fink(fn,ln,j,rpo){}highfink::highfink():abstr_emp(),manager(),fink(){}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.