虚基类(virtual base class)
声明虚基类的一般形式为:
class 派生类名 : virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该派生类一次,也就是说,基类成员只保留一次。为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承
规定:在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化
C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类数据成员不会被对此初始化
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 //声明公共基类Person
7 class Person
8 {
9 public:
10 Person(string nam , char se , int a)
11 {
12 name = nam ;
13 sex = se ;
14 age = a ;
15 }
16 protected:
17 string name ;
18 char sex ;
19 int age ;
20 };
21
22 //声明Person的直接派生类Teacher
23 class Teacher : virtual public Person //声明Person为公共继承的虚基类
24 {
25 public:
26 Teacher(string nam , char se , int a , string ti) : Person(nam , se , a)
27 {
28 title = ti ;
29 }
30 protected:
31 string title ;
32 };
33
34 //声明Person的直接派生类Student
35 class Student : virtual public Person //声明Person为公共继承的虚基类
36 {
37 public:
38 Student(string nam , char se , int a , float sco) : Person(nam , se , a) , score(sco) {}
39 protected:
40 float score ;
41 };
42
43 //声明多重继承的派生类Graduate
44 class Graduate : public Teacher , public Student
45 {
46 public:
47 Graduate(string nam , char se , int a , string ti , float sco , float wa) : Person(nam , se , a) , Teacher(nam , se , a , ti) , Student(nam , se , a , sco) , wage(wa) {}
48 void show()
49 {
50 cout << "name :" << name << endl ;
51 cout << "sex :" << sex << endl ;
52 cout << "age :" << age << endl ;
53 cout << "title :" << title << endl ;
54 cout << "score :" << score << endl ;
55 cout << "wage :" << wage << endl ;
56 }
57 private:
58 float wage ;
59 };
60
61 //主函数
62 int main(void)
63 {
64 Graduate grad("Wangli" , 'f' , 24 , "assistant" , 89.6 , 2000.6);
65 grad.show();
66 return 0 ;
67 }
在Graduate类中,只保留一份基类的成员,因此可以用Graduate类中的show函数引用Graduate类对象中的公共基类Person的数据成员name , sex , age 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。