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

 

转载于:https://www.cnblogs.com/lightmonster/p/10439999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值