码迷,mamicode.com
首页 > 其他好文 > 详细

虚基类&虚继承

时间:2016-05-27 10:44:11      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

发现这个月准备竞赛完全没有更新哎。。。

改了下某华大一c++测试题。。。网上对虚继承讲的要么太繁琐要么不到位,自力更生

 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4 class A
 5 {
 6 public:
 7     A(int i) {
 8         a = i;
 9         cout << "a=" << a << endl;
10     }
11     ~A() { cout << "A‘s destructor " << a << endl; }
12     int a;
13 };
14 class B : virtual public A15 {
16 public:
17     B(int i, int j) : A(i) { cout << "B:" << j << endl;
18     cout << "virtual A:" << a << endl;
19     }
20 };
21 
22 class C : virtual public A
23 {
24 public:
25     C(int i, int j) : A(i)
26     {
27         cout << "C:" << i + j << endl;
28     }
29 };
30 class D : public B, public C
31 {
32 public:
33     D(int k1, int k2, int k3, int k4) : B(k1, k2), C(k4, k3), A(233)
34     {
35         cout << "D:" << k4 << endl;
36     }
37 };
38 void main()
39 {
40     D d(1, 2, 3, 4);
41     A a(5);
42     a = A(6);
43     cout << "a.a=" << a.a << endl;
44     cout << "d.a=" << d.a << endl;
45 }

技术分享

我们可以看出,通过虚继承方式的派生类并不调用基类的构造函数。

 

 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4 class A
 5 {
 6 public:
 7     A(int i) {
 8         a = i;
 9         cout << "a=" << a << endl;
10     }
11     ~A() { cout << "A‘s destructor " << a << endl; }
12     int a;
13 };
14 class B : public A
15 {
16 public:
17     B(int i, int j) : A(i) { cout << "B:" << j << endl;
18     //cout << "virtual A:" << a << endl;
19     }
20 };
21 
22 class C : public A
23 {
24 public:
25     C(int i, int j) : A(i)
26     {
27         cout << "C:" << i + j << endl;
28     }
29 };
30 class D : public B, public C
31 {
32 public:
33     D(int k1, int k2, int k3, int k4) : B(k1, k2), C(k4, k3) //A(k1)
34     {
35         cout << "D:" << k4 << endl;
36     }
37 };
38 void main()
39 {
40     D d(1, 2, 3, 4);
41     A a(5);
42     a = A(6);
43     cout << "a.a=" << a.a << endl;
44     //cout << "d.a=" << d.a << endl;
45 }

当我们注释掉B,C对A的virtual继承方式后,由于派生类不允许访问间非虚拟接继承的基础类,程序会报错。

然后我对程序又做了注释改动,可以看出,此时D继承了B,C,B,C又都继承了A,也就是说B,C间接地继承了两次A。我们的程序比较简单都是普通变量,要是复杂一点(来点指针,引用动态分配的数据成员什么的)就麻烦了。

虚继承的B,C对A没什么作用,只是为了在D中不重复继承,到D中才真正有了A的继承

虚基类&虚继承

标签:

原文地址:http://www.cnblogs.com/yuelien/p/5533520.html

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