虚基类&虚继承

Posted 脑洞的分析与证明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚基类&虚继承相关的知识,希望对你有一定的参考价值。

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

改了下某华大一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 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 : 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的继承

以上是关于虚基类&虚继承的主要内容,如果未能解决你的问题,请参考以下文章

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解

理解虚基类多重继承的问题

理解虚基类多重继承的问题

19.理解虚基类虚继承

虚基类 和 虚函数

类的继承派生析构函数虚基类