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