虚基类(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 }

虚基类(virtual base class)

在Graduate类中,只保留一份基类的成员,因此可以用Graduate类中的show函数引用Graduate类对象中的公共基类Person的数据成员name , sex , age 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。

原文链接: https://www.cnblogs.com/liangyan19910818/archive/2011/10/23/2221747.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    虚基类(virtual base class)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/34900

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午11:49
下一篇 2023年2月8日 上午11:50

相关推荐