这里我充斥着大量的内联函数,这样看起来貌似比较乱?还是阅读性更好?
ARSTR.h
#pragma once
#ifndef ABSTR_H_
#define ABSTR_H_
#include <string>
#include <iostream>
class 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 employee : public abstr_emp {
public:
~employee() {};
employee() :abstr_emp() {};
employee(const std::string & fn, const std::string & ln, const std::string & j)
:abstr_emp(fn, ln, j) {};
virtual void ShowAll()const{abstr_emp::ShowAll();};
virtual void SetAll() { abstr_emp::SetAll(); };
};
class manager :virtual public abstr_emp {
private:
int inchargeof;
protected:
int InChargeof() const { return inchargeof; }
int & InChargeof() { return inchargeof; }
public:
~manager() {};
manager() :abstr_emp(), inchargeof(0) {};
manager(const std::string & fn, const std::string & ln,
const std::string & j, int ico = 0)
:abstr_emp(fn, ln, j), inchargeof(ico) {};
manager(const abstr_emp & e, int ico) :abstr_emp(e), inchargeof(ico) {};
manager(const manager & m) :abstr_emp(m) { inchargeof = m.inchargeof; };
virtual void ShowAll()const;
virtual void SetAll();
};
class 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() :abstr_emp() {};
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(const abstr_emp & e, const std::string & rpo)
:abstr_emp(e), reportsto(rpo) {};
fink(const fink & e) :abstr_emp(e) { reportsto = e.reportsto; };
virtual void ShowAll()const;
virtual void SetAll();
};
class highfink :public manager,public fink{
public:
~highfink() {};
highfink() :manager(), fink() {};
highfink(const std::string & fn, const std::string & ln,
const std::string & j, const std::string & rpo,
int ico)
:manager(fn, ln, j,ico), fink(fn, ln, j, rpo) {};
highfink(const abstr_emp & e, const std::string & rpo, int ico)
:manager(e, ico), fink(e, rpo) {};
highfink(const fink & f, int ico)
:manager(f, ico), fink(f) {};
highfink(const manager & m, const std::string & rpo)
:manager(m), fink(m, rpo) {};
highfink(const highfink & h)
:manager(h), fink(h) {};
virtual void ShowAll()const;
virtual void SetAll();
};
#endif
ABSTR.cpp
#include "ABSTR.h"
#include <iostream>
abstr_emp::~abstr_emp() {};
abstr_emp::abstr_emp()
{
fname = '\0';
lname = '\0';
job = '\0';
}
abstr_emp::abstr_emp(const std::string & fn, const std::string & ln, const std::string & j)
{
fname = fn;
lname = ln;
job = j;
}
void abstr_emp::ShowAll() const
{
using std::cout;
using std::endl;
cout << "fname: " << fname<<endl
<< "lname: " << lname<<endl
<< "job: " << job<<endl;
}
void abstr_emp::SetAll()
{
using std::cout;
using std::cin;
using std::endl;
cout << "Enter a first name: ";
getline(cin, fname);
cout << "Enter a last name: ";
getline(cin, lname);
cout << "Enter a job: ";
getline(cin, job);
}
std::ostream & operator<<(std::ostream & os, const abstr_emp & e)
{
os << "fname: " << e.fname<<std::endl
<< "lname: " << e.lname<<std::endl
<< "job: " << e.job << std::endl;
return os;
}
void manager::ShowAll() const
{
abstr_emp::ShowAll();
std::cout << "inchargeof: " << inchargeof << std::endl;
}
void manager::SetAll()
{
abstr_emp::SetAll();
std::cout << "Enter a digit of intchargeof: ";
std::cin >> inchargeof;
while (std::cin.get() != '\n')
continue;
}
void fink::ShowAll() const
{
abstr_emp::ShowAll();
std::cout << "reportsto: " << reportsto << std::endl;
}
void fink::SetAll()
{
abstr_emp::SetAll();
std::cout << "Enter a reportsto: ";
getline(std::cin, reportsto);
}
void highfink::ShowAll() const
{
manager::ShowAll();
std::cout << "reportsto: " << ReportsTo() << std::endl;
}
void highfink::SetAll()
{
manager::SetAll();
std::cout << "Enter a repotrsto: ";
getline(std::cin, ReportsTo());
}
main.cpp
#include <iostream>
#include "ABSTR.h"
using namespace std;
int main(void)
{
employee em("Trip", "Harris", "Thumper");
cout << em << endl;
em.ShowAll();
manager ma("Amorphia", "Spindragon", "Nuancer", 5);
cout << ma << endl;
ma.ShowAll();
fink fi("Matt", "Oggs", "Oiler", "Juno Barr");
cout << fi << endl;
fi.ShowAll();
highfink hf(ma, "Curly Kew");
hf.ShowAll();
cout << "Press a key for next phase:\n";
//cin.get();
highfink hf2;
hf2.SetAll();
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();
cin.get();
return 0;
}