C++ 私有继承 多重继承
#ifndef PRO1_WORKERMI_H
#define PRO1_WORKERMI_H
#include <string>
using namespace std;
class Worker {
private:
string fullname;
long id;
protected:
virtual void Data()const ;
virtual void Get();
public:
Worker():fullname("no one"), id(0L){}
Worker(const string & s, long n) :fullname(s), id(n){}
virtual ~Worker();
virtual void Set()=0;
virtual void Show()const = 0;
};
class Waiter:virtual public Worker{
private:
int panache;
protected:
void Data()const ;
void Get();
public:
Waiter():Worker(), panache(0){}
Waiter(const string & s, long n, int p = 0):Worker(s, n), panache(p){}
Waiter(const Worker & wk, int p = 0):Worker(wk), panache(p){}
void Set();
void Show()const ;
};
class Singer: virtual public Worker{
protected:
enum {other, alto, contralto, soprano, bass, baritone, tenor};
enum {Vtypes = 7};
void Data()const ;
void Get();
private:
static char *pv[Vtypes];
int voice;
public:
Singer():Worker(), voice(other){}
Singer(const string & s, long n, int v = other):Worker(s, n), voice(v){}
Singer(const Worker & wk, int v = other): Worker(wk), voice(v){}
void Set();
void Show()const ;
};
// 多重继承
class SingingWaiter:public Singer,public Waiter{
protected:
void Data()const ;
void Get();
public:
SingingWaiter(){}
SingingWaiter(const string & s, long n, int p = 0, int v = other)
:Worker(s, n), Waiter(s, n, p), Singer(s, n, v){}
SingingWaiter(const Worker & wk, int p = 0, int v = other)
:Worker(wk), Waiter(wk, p), Singer(wk, v){}
SingingWaiter(const Waiter &wt, int v = other)
:Worker(wt), Waiter(wt), Singer(wt, v){}
SingingWaiter(const Singer & wt, int p = 0)
:Worker(wt), Waiter(wt, p), Singer(wt){}
void Set();
void Show()const ;
};
#endif //PRO1_WORKERMI_H
#include "workermi.h"
#include <iostream>
using namespace std;
Worker::~Worker() {}
void Worker::Data() const {
cout << "Name: " << fullname << endl;
cout << "Employee ID: " << id << endl;
}
void Worker::Get() {
getline(cin, fullname);
cout << "Enter worker's ID: ";
cin >> id;
while (cin.get()!='\n')
continue;
}
void Waiter::Set() {
cout << "Enter waiter's name: ";
Worker::Get();
Get();
}
void Waiter::Show() const {
cout << "Category: waiter\n";
Worker::Data();
Data();
}
void Waiter::Data() const {
cout << "Panache rating: " << panache << endl;
}
void Waiter::Get() {
cout << "Enter waiter's panache rating: ";
cin >> panache;
while (cin.get()!='\n')
continue;
}
char * Singer::pv[Singer::Vtypes] = {"other", "alto", "contralto", "soprano", "bass", "baritone", "tenor"};
void Singer::Set() {
cout << "Enter singer's name: ";
Worker::Get();
Get();
}
void Singer::Show() const {
cout << "Category : singer \n";
Worker::Data();
Data();
}
void Singer::Data() const {
cout << "Vocal range: " << pv[voice] << endl;
}
void Singer::Get() {
cout << "Enter number for singer's vocal range:\n";
int i;
for(i = 0; i < Vtypes; i++){
cout << i << " : " << pv[i] << " ";
if (i % 4 == 3) {
cout << endl;
}
}
if (i % 4 != 0) {
cout << endl;
}
cin >> voice;
while (cin.get() != '\n') {
continue;
}
}
void SingingWaiter::Data() const {
Singer::Data();
Waiter::Data();
}
void SingingWaiter::Get() {
Waiter::Get();
Singer::Get();
}
void SingingWaiter::Set() {
cout << "Enter singing waiter's name: ";
Worker::Get();
Get();
}
void SingingWaiter::Show() const {
cout << "Category : singing waiter\n";
Worker::Data();
Data();
}
#include <iostream>
#include <cstring>
#include "module10_code_reuse/workermi.h"
using namespace std;
// 代码的重用,私有继承,多重继承
const int SIZE_M = 5;
void workmi(){
Worker * lolas[SIZE_M];
int ct;
for (ct = 0; ct < SIZE_M; ct++) {
char choise;
cout << "Enter the employee category:\n"
<< "w: waiter s: singer t: singing waiter q: quit\n";
cin >> choise;
while (strchr("wstq", choise) == NULL) {
cout << "Please enter a w, s, t, or q: ";
cin >> choise;
}
if (choise == 'q')
break;
switch (choise) {
case 'w': lolas[ct] = new Waiter;
break;
case 's': lolas[ct] = new Singer;
break;
case 't': lolas[ct] = new SingingWaiter;
break;
}
cin.get();
lolas[ct]->Set();
}
cout << "\nHere is your sraff:\n";
int i;
for (i = 0; i < ct; i++) {
cout << endl;
lolas[i]->Show();
}
for (i = 0; i < ct; i++)
delete lolas[i];
cout << "Bye.\n";
}
int main() {
workmi();
return 0;
}