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