多重继承虚基类 vc6.0编译通过

来源:互联网 发布:有没有抓阄软件 编辑:程序博客网 时间:2024/06/05 06:57

多重继承虚基类

//                      worker

 

   singer:public worker            waiter:public worker

                

                   singerwaiter:public singer,public waiter

如上如继承关系的时候

=>>问题出现:
singerwaiter ed;  //这样会产生二义性,因为singer与waiter都包含worker对象(成员)
worker * p=&ed;  

=>>解决方案1:
使用强制转换
singerwaiter ed;
worker * p1=(singer*) &ed;
worker * p2=(waiter*) &ed;

=>>解决方案2:
使用虚基类
class singer:virtual public worker {…};           
class waiter:virtual public worker {…};

1>使用虚基类需要如此用构造函数
singerwaiter(const worker & wk,int p=0,int v=singer::other):worker(wk),waiter(wk,p),singer(wk,v)

为避免wk传递路径为多条歧异,所以必须显式的调用虚基类的构造函数worker(wk)


2>使用那个方法
singerwaiter newhi("hello hi",2005,6,soprano);
newhi.singer::show();  //指明属于那个类的方法

最好是定义如下
void singerwaiter::show()
{
     singer::show(); 
}


////////////////////////////////////////////////////////////////////
/////////////////////main.cpp///////////////////////////////////////
// workmi.cpp -- multiple inheritance
// compile with workermi.cpp
#include <iostream>
#include <cstring>
#include "worker.h"
const int SIZE = 5;

int main()
{
   using std::cin;
   using std::cout;
   using std::endl;
  

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


///////////////////////////////////////////////////////////////
/////////////////////////////////worker.h//////////////////////
#ifndef WORKER_H_
#define WORKER_H_

#include <string>

class Worker
{
private:
 std::string fullname;
 long id;
protected:
 virtual void Data() const;
 virtual void Get();
public:
 Worker():fullname("no one"),id(0L) {}
 Worker(const std::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 panache;
protected:
 void Data() const;
 void Get();
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 Show() const;
};

class Singer:virtual public Worker
{
protected:
 enum {other,alto,contralto,soptano,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 std::string & s,long n,int v=other):Worker(s,n),voice(v){}
    Singer(const Worker & wk,int v=other):Worker(wk),voice(other){}
 void Set();
 void Show() const;
};   

class SingingWaiter:public Singer,public Waiter
{
protected:
 void Data() const;
 void Get();
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 Show() const;
};

#endif

 

////////////////////////////////////////////////////////////////////////
///////////////////////worker.cpp///////////////////////////////////////
// workermi.cpp -- working class methods with MI
#include "worker.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
// Worker methods
Worker::~Worker() { }

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

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

// Waiter methods
void Waiter::Set()
{
    cout << "Enter waiter's name: ";
    Worker::Get();
    Get();
}

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

// protected methods
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;
}

// Singer methods

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

// protected methods
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;
}

// SingingWaiter methods
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();
}

原创粉丝点击