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的继承

  • 相关阅读:
    遗传算法(Genetic Algorithm, GA)及MATLAB实现
    CCF CSP 201809-2 买菜
    PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
    PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
    PAT (Basic Level) Practice (中文)1004 成绩排名 (20 分)
    PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)
    PAT (Advanced Level) Practice 1001 A+B Format (20 分)
    BP神经网络(原理及MATLAB实现)
    问题 1676: 算法2-8~2-11:链表的基本操作
    问题 1744: 畅通工程 (并查集)
  • 原文地址:https://www.cnblogs.com/yuelien/p/5533520.html
Copyright © 2011-2022 走看看