zoukankan      html  css  js  c++  java
  • 虚基类&虚继承

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

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

  • 相关阅读:
    .OBJ est1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
    线程详细剖析(四)
    线程详细剖析(三)
    线程详细剖析(二)
    线程详细剖析(一)
    CAN总线相关的几个gitlab代码
    进程详细剖析(三)
    C++实现多级排序
    C/C++读写二进制文件
    C++11新特性
  • 原文地址:https://www.cnblogs.com/yuelien/p/5533520.html
Copyright © 2011-2022 走看看