当前位置: 首页 > news >正文

虚基类虚继承

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

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

转载于:https://www.cnblogs.com/yuelien/p/5533520.html

相关文章:

  • 导出无法正常启动的VMware虚拟机中的文件
  • CentOS 下的邮件通知
  • Linux内核--usb子系统的分析
  • 安装db2 提示不是有效的win32应用程序?
  • 建站须知
  • Java中如何实现类似C++结构体的二级排序
  • 防暴力破解 Fail2Ban之python
  • JMETER 2.10的安装
  • 缓存 - 运行时内存缓存
  • lvs群集-nat模型
  • 原创D3D几何实例化的DEMO
  • 将 Shiro 作为应用的权限基础 四:shiro的配置说明
  • 理解NAT的地址类型
  • centos 6.5安装vncserver 并开启远程桌面
  • 词性标注-隐马尔科夫模型应用
  • 【笔记】你不知道的JS读书笔记——Promise
  • 10个确保微服务与容器安全的最佳实践
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Angular6错误 Service: No provider for Renderer2
  • IOS评论框不贴底(ios12新bug)
  • MD5加密原理解析及OC版原理实现
  • PV统计优化设计
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue 配置sass、scss全局变量
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 让你的分享飞起来——极光推出社会化分享组件
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 项目实战-Api的解决方案
  • No resource identifier found for attribute,RxJava之zip操作符
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (2)Java 简介
  • (ibm)Java 语言的 XPath API
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (规划)24届春招和25届暑假实习路线准备规划
  • (南京观海微电子)——I3C协议介绍
  • (排序详解之 堆排序)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)winform之ListView
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .net core 6 集成和使用 mongodb
  • .Net7 环境安装配置
  • .net快速开发框架源码分享
  • .NET与 java通用的3DES加密解密方法
  • .ui文件相关
  • /etc/sudoers (root权限管理)
  • @RestController注解的使用
  • [ C++ ] STL---string类的使用指南
  • [ C++ ] STL---仿函数与priority_queue
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)