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