发现这个月准备竞赛完全没有更新哎。。。
改了下某华大一c++测试题。。。网上对虚继承讲的要么太繁琐要么不到位,自力更生
1 #include2 #include 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 A23 {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 C31 {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 #include2 #include 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 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 : public A23 {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 C31 {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的继承