虚基类(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 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值