1、 虚基类的作用
图 21
现在,将类A声明为虚基类,方法如下:
声明虚基类的一般形式为:
class派生类名:virtual 继承方式 基类名
需要注意:为了保证虚基类在派生类中只继才一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。如果像图5.24所示的那样,在派生类B和C中将类A声明为虚基类,而在派生类D中没有将类A声明为虚基类,则在派生类E中,虽然从类B和c路径派生的部分只保留一份基类成员,但从类D路径派生的部分还保留一份基类成员。
图23
2、虚基类的初始化
例如:
注意:
规定:在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。
3、虚基类的简单应用举例
在Teacher类和Student类之上增加一个共同的基类Person,如图25所示。作为人员的一些基本数据都放在Person中,在Teacher类和Student类中再增加一些必要的数据。
#include <iostream>
#include <string>
using namespace std;
1、定义公共基类Person
class Person
{ public:
Person(char *nam,char s,int a) //构造函数
{ strcpy(name,nam);sex=s;age=a;}
protected: //保护成员
char name[20];
char sex;
int age; };
2、定义类Teacher
class Teacher:virtual public Person //声明Person为公用继承的虚基类
{ public:
Teacher(char *nam,char s,int a,char *t):Person(nam,s,a) //构造函数
{ strcpy(title,t); }
protected: //保护成员
char title[10]; }; //职称
3、定义类Student
class Student:virtual public Person //声明Person为公用继承的虚基类
{ public:
Student(char *nam,char s,int a,float sco): //构造函数
Person(nam,s,a),score(sco){} //初始化表
protected: //保护成员
float score; };//成绩
4、定义多重继承的派生类Graduate
class Graduate:public Teacher,public Student //声明Teacher和Student类为公用继承直接基类
{ public:
Graduate(char *nam,char s,int a,char *t,float sco,float w): //构造函数
Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w){} //初始化表
void show( ) //输出研究生的有关数据
{ cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wages:"<<wage<<endl; }
private:
float wage; }; //工资
int main( )
{ Graduate grad1("Wang-li",'f',24,"assistant",89.5,1234.5);
grad1.show( );
return 0; }
运行结果为
说明:
Graduate(研究生)是Teacher类和Student类的派生类,在Graduate类中增加wage(津贴)。一个研究生应当包含以上全部数据。为简化程序,除了最后的派生类Graduate外,在其他类中均不包含成员函数。