第十四章编程练习(5)

这里我充斥着大量的内联函数,这样看起来貌似比较乱?还是阅读性更好?

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值