星球狂想战队|一起来学C++:C++中的代码重用( 九 )


下面来看一个例子 , 并介绍有哪些问题以及如何解决它们 。 要使用MI , 需要几个类 。 我们将定义一个抽象基类Worker , 并使用它派生出Waiter类和Singer类 。 然后 , 便可以使用MI从Waiter类和Singer类派生出SingingWaiter类(参见图14.3) 。 这里使用两个独立的派生来使基类(Worker)被继承 , 这将导致MI的大多数麻烦 。 首先声明Worker、Waiter和Singer类 , 如程序清单14.7所示 。
程序清单14.7Worker0.h
//worker0.h--workingclasses#ifndefWORKER0_H_#defineWORKER0_H_#includeclassWorker//anabstractbaseclass{private:std::stringfullname;longid;public:Worker():fullname("noone"),id(0L){}Worker(conststd::string&s,longn):fullname(s),id(n){}virtual~Worker()=0;//purevirtualdestructorvirtualvoidSet();virtualvoidShow()const;};classWaiter:publicWorker{private:intpanache;public:Waiter():Worker(),panache(0){}Waiter(conststd::string&s,longn,intp=0):Worker(s,n),panache(p){}Waiter(constWorker&wk,intp=0):Worker(wk),panache(p){}voidSet();voidShow()const;};classSinger:publicWorker{protected:enum{other,alto,contralto,soprano,bass,baritone,tenor};enum{Vtypes=7};private:staticchar*pv[Vtypes];//stringequivsofvoicetypesintvoice;public:Singer():Worker(),voice(other){}Singer(conststd::string&s,longn,intv=other):Worker(s,n),voice(v){}Singer(constWorker&wk,intv=other):Worker(wk),voice(v){}voidSet();voidShow()const;};#endif程序清单14.7的类声明中包含一些表示声音类型的内部常量 。 一个枚举用符号常量alto、contralto等表示声音类型 , 静态数组pv存储了指向相应C-风格字符串的指针 , 程序清单14.8初始化了该数组 , 并提供了方法的定义 。
【星球狂想战队|一起来学C++:C++中的代码重用】程序清单14.8worker0.cpp
//worker0.cpp--workingclassmethods#include"worker0.h"#includeusingstd::cout;usingstd::cin;usingstd::endl;//Workermethods//mustimplementvirtualdestructor,evenifpureWorker::~Worker(){}voidWorker::Set(){cout<<"Enterworker'sname:";getline(cin,fullname);cout<<"Enterworker'sID:";cin>>id;while(cin.get()!='n')continue;}voidWorker::Show()const{cout<<"Name:"<<fullname<<"n";cout<<"EmployeeID:"<<id<<"n";}//WaitermethodsvoidWaiter::Set(){Worker::Set();cout<<"Enterwaiter'spanacherating:";cin>>panache;while(cin.get()!='n')continue;}voidWaiter::Show()const{cout<<"Category:waitern";Worker::Show();cout<<"Panacherating:"<<panache<<"n";}//Singermethodschar*Singer::pv[]={"other","alto","contralto","soprano","bass","baritone","tenor