虚基类

#ifndef _WORKER_H_
#define _WORKER_H_

#include <string>

/**< A abstract base class */
class Worker
{
private:
    std::string fullname;
    long id;

protected:
    virtual void Data(void) const;
    virtual void Get(void);

public:
    Worker()                                : fullname("no one"), id(0L){}
    Worker(const std::string & s, long n)   : fullname(s), id(n)        {}
    virtual ~Worker() = 0;                  //pure virtual destructor
    virtual void Set(void) = 0;
    virtual void Show(void) const = 0;
};

class Waiter : virtual public Worker
{
private:
    int panache;

protected:
    void Data(void) const;
    void Get(void);

public:
    Waiter()                                            : Worker(), panache(0)      {}
    Waiter(const std::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);
    void Show(void) const;
};

class Singer : virtual public Worker
{
protected:
    enum{other, alto, contralto, soprano, bass, baritone, tenor};
    enum{Vtypes = 7};

    void Data(void) const;
    void Get(void);

private:
    static char * pv[Vtypes];   //string equivs of voice types
    int voice;

public:
    Singer()                                                : Worker(), voice(other)    {}
    Singer(const std::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);
    void Show(void) const;
};


/**< multiple inheritance */
class SingingWaiter : public Singer, public Waiter
{
protected:
    void Data(void) const;
    void Get(void);

public:
    SingingWaiter() {}
    SingingWaiter(const std::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);
    void Show(void) const;
};

#endif //#define _WORKER_H_
#include "worker.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

/**< Worker methods */

//must implement virtual destructor, even if pure
Worker::~Worker() {}

//protected methods
void Worker::Data(void) const
{
    cout << "Name: " << fullname << endl;
    cout << "Employee ID: " << id << endl;
}

void Worker::Get(void)
{
    getline(cin, fullname);
    cout << "Enter worker's ID: ";
    cin >> id;
    while(cin.get() != '
')
    {
        continue;
    }
}

/**< Waiter methods */

void Waiter::Set(void)
{
    cout << "Enter waiter's panache rating: ";
    Worker::Get();
    Get();
}

void Waiter::Show(void) const
{
    cout << "Category: waiter
";
    Worker::Data();
    Data();
}

//protected methods
void Waiter::Data(void) const
{
    cout << "Panache rating: " << panache << endl;
}
void Waiter::Get(void)
{
    cout << "Enter waiter's panache rating: ";
    cin >> panache;
    while(cin.get() != '
')
    {
        continue;
    }
}

/**< Singer methods */

char * Singer::pv[Singer::Vtypes] = {"other", "alto", "contralto", "soprano", "bass", "baritone", "tenor"};

void Singer::Set(void)
{
    cout << "Enter singer's name: ";
    Worker::Get();
    Get();
}

void Singer::Show(void) const
{
    cout << "Category: singer
";
    Worker::Data();
    Data();
}

//protected methods
void Singer::Data(void) const
{
    cout << "Vocal range: " << pv[voice] << endl;
}

void Singer::Get(void)
{
    cout << "Enter number for singer's vocal range:
";
    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() != '
')
    {
        continue;
    }
}

/**< SingingWaiter methods */

void SingingWaiter::Data(void) const
{
    Singer::Data();
    Waiter::Data();
}

void SingingWaiter::Get(void)
{
    Waiter::Get();
    Singer::Get();
}

void SingingWaiter::Set(void)
{
    cout << "Enter singing waiter's name: ";
    Worker::Get();
    Get();
}

void SingingWaiter::Show(void) const
{
    cout << "Category: singing waiter
";
    Worker::Data();
    Data();
}
#include <iostream>
#include <cstring>
#include "worker.h"

using std::cout;
using std::cin;
using std::endl;

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:
" << "w: waiter  s: singer  " << "t: singing waiter  q: quit
";
        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 << "
Here is your staff:
";

    for(int i = 0; i < ct; i++)
    {
        cout << endl;
        lolas[i]->Show();
    }
    for(int i = 0; i < ct; i++)
    {
        delete lolas[i];
    }

    cout << "Bye.
";

    return 0;
}
原文地址:https://www.cnblogs.com/pingge/p/3375992.html