码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++ 多继承(虚继承和构造顺序)

时间:2017-07-26 20:26:13      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:prot   共享   赋值   函数   多个   相同   div   一个   构造   

C/C++:一个基类继承和多个基类继承的区别

1.对个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性,而如果出现在同一阶层, 则会 出现二义性,解决办法:要么在同一阶层的底层(派生类)中重新定义可以解决,或者使用虚继承(减少部分二义性)

2.虚继承保证多次继承相同基类但只有一份基类数据(保证共享);

3.虚继承的构造顺序由编译器按照派生类列表从左往右寻找虚基类函数,先构造虚基类部分,然后按照正常构造从左到右构造,最后构造本身,而析构相反

4.派生类的合成拷贝和构造,赋值都是按照上述规则执行,所以手动写拷贝,构造,和赋值时,需要按照这个顺序构造

 

 

C/C++代码:

 1 #include <cstdlib>
 2 #include <iostream>
 3 
 4 class Class
 5 {
 6 };
 7 
 8 class Base : public Class
 9 {
10 protected:
11     int value;
12 public:
13     Base() : value(0)
14     {};
15 
16     Base(const Base &rhs) : Class(), value(rhs.value)
17     {};
18 
19     Base(int a) : value(a), Class()
20     {};
21 };
22 
23 
24 class D1 : virtual public Base
25 {
26 public:
27     D1() : Base()
28     {};
29 
30     D1(int a) : Base(a)
31     {};
32 
33     D1(const D1 &rhs) : Base(rhs)
34     {};
35 };
36 
37 class D2 : virtual public Base
38 {
39 public:
40     D2() : Base()
41     {};
42 
43     D2(int a) : Base(a)
44     {};
45 
46     D2(const D2 &rhs) : Base(rhs)
47     {};
48 };
49 
50 
51 class MI : public D1, public D2
52 {
53 public:
54     MI() : D1(), D2()
55     {}
56 
57     MI(int a) : Base(a), D1(a), D2(a)
58     {};
59 
60     MI(const MI &rhs) : Base(rhs), D1(rhs), D2(rhs)
61     {};
62 };
63 
64 class Final : public MI, public Class
65 {
66 public:
67     using Base::value;
68 
69     Final()
70     {};
71 
72     Final(int a) : Base(a), MI(a), Class()
73     {};
74 
75     Final(const Final &rhs) : Base(rhs), MI(rhs), Class()
76     {};
77 
78 };
79 
80 
81 int main()
82 {
83     Final A(20);
84     std::cout << A.value << std::endl;
85     return 0;
86 }

 

 

         

C/C++ 多继承(虚继承和构造顺序)

标签:prot   共享   赋值   函数   多个   相同   div   一个   构造   

原文地址:http://www.cnblogs.com/xuaidongstdudyrecording/p/7241411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!