[C++]MI(多继承)实例-基础版
#pragma once #ifndef WORKRMI_H_ #define WORKRMI_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() = 0; virtual void Set() = 0; virtual void Show() const = 0; }; class Waiter :virtual public Worker { private: int pannche; protected: void Data() const; void Get(); public: Waiter() :Worker(), pannche(0) {} Waiter(const string& s, long n, int p = 0) :Worker(s, n), pannche(p) {} Waiter(const Worker& wk, int p = 0) :Worker(wk), pannche(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: const 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 // !WORKRMI_H_ #include "pch.h" #include "workrmi.h" #include <iostream> 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: " << pannche << endl; } void Waiter::Get() { cout << "Enter waiter's panache rating: "; cin >> pannche; while (cin.get() != '\n') continue; } const 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 << '\n'; 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 "pch.h" #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <ctime> #include "workrmi.h" const int SIZE = 5; int main(void) { Worker* lolas[SIZE]; int ct; for (ct = 0; ct < SIZE; ct++) { char choice; cout << "Enter the employee category:\n" << "w: waiter s: singer " << "t: singing waiter q: quit\n"; cin >> choice; while (strchr("wstq",choice)==NULL) { cout << "Please enter a w, s, t, or q: "; cin >> choice; } if (choice == 'q') break; switch (choice) { 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 staff:\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"; return 0; }