虚基类&虚继承

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

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

时间: 2024-12-16 03:07:10

虚基类&虚继承的相关文章

C++虚继承和虚基类

看如下代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A { 6 public: 7 A() {}; 8 9 protected: 10 int m_a; 11 }; 12 13 class B : public A 14 { 15 public: 16 B(){}; 17 18 protected: 19 int m_b; 20 }; 21 22 class C : public A 23 { 24 public: 2

C++的虚基类知识点

当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类. class x1:virtual public x{//... ...};class x2:virtual public x{//... ...};虚基类的初始化 虚基类(虚拟继承)的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同. 派生类的构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之

重拾C++之虚函数和虚基类以及抽象类

一.引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了. 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{  ...  }  a=A();//尼玛这都能行,被踢大了 二.虚函数和一般函数 虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果.     virtual void show(){         co

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,

C++中的 虚函数 纯虚函数 虚基类(virtual)

前言:需要了解三者的区别,必须要掌握多态的三个必要条件: 继承 重载 父类指针指向子类对象. 虚函数 纯虚函数 虚基类三者区别 1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的. 2.纯虚函数是用来定义接口的,也就是基类中定义一个纯虚函数,基类不用实现,让子类来实现. 3.虚基类是用来在多继承中,比如菱形继承中,如果两个父类继承自同一个类,就只实例化一个父类 ①虚函数第一个是没有使用多态(只用继承)的一般实现方式: class A { public:

C++ 类的继承五(多继承的二义性--虚基类)

//多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 */ class Point{ public: Point(){ x = 1; y = 1; } int x; int y; }; class PointA :virtual public Point{ public: PointA(){ a = 2; } int a; }; class PointB :vir

虚基类 继承中的构造函数

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:d.cpp *作 者:张旺华 *完成日期:2015年6月1日 *版 本 号:v1.0 */ #include <iostream> using namespace std; class Base { public: Base(char i) { cout<<"Base constructor. --"<<i<<

C++ 虚基类 派生与继承

在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转原则”. 继承分为public继承,protect继承,private继承 public:父类中的public,protected成员到了派生类中属性不变. protected:父类中的public,protected成员到了派生类中,都变为protected成员. private:父类中的publ

第十二周 阅读程序 虚基类 中的继承

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:d.cpp *作 者:张旺华 *完成日期:2015年6月1日 *版 本 号:v1.0 */ #include <iostream> using namespace std; class Base { public: Base(char i) { cout<<"Base constructor. --"<<i<<