多重继承虚基类 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();
}
- 多重继承虚基类 vc6.0编译通过
- 例子 vc6.0 编译通过
- 例子 vc6.0 编译通过
- 多线程 vc6.0 编译通过
- 类模板 vc6.0编译通过
- 多重继承与虚基类
- 多重继承和虚基类
- 多重继承和虚基类
- 多重继承虚基类大小
- 多重继承 与 虚基类
- 虚基类与多重继承
- 多重继承与虚基类
- 多重继承和虚基类
- c++ 多重继承 + 虚基类
- 多重继承与虚基类
- 虚基类与多重继承
- 类模板-实例为指针 vc6.0编译通过
- 多重继承以及多重继承中二义性的解决:虚基类
- 程序员面试 ---- struct和class的区别
- Python2入门教程 超详细1小时学会Python
- 浅谈过载保护(转自腾讯大讲堂)
- 华清远见ARM A8 Uboot流程
- JDBC调用存储过程
- 多重继承虚基类 vc6.0编译通过
- Java动态调用方法
- check_rpm.sh
- .Net 成员设计准则
- C51中各种函数总结
- 如何把SQLServer数据库从高版本降级到低版本?
- java源文件的特点
- MyEclipse快捷键大全
- windows平台中使用curl实现Http请求