博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚基类&虚继承
阅读量:6510 次
发布时间:2019-06-24

本文共 2078 字,大约阅读时间需要 6 分钟。

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

改了下某华大一c++测试题。。。网上对虚继承讲的要么太繁琐要么不到位,自力更生

1 #include
2 #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 #include
2 #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的继承

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

你可能感兴趣的文章
zcu106 固化_xilinx zcu106 vcu demo
查看>>
java ftpclient 代码_java后台代码ftpclient下载文件
查看>>
java数据库生成model_继承BaseModelGenerator 生成Model时添加数据库表字段 生成代码示例...
查看>>
matlab建立桌面图标,在ubuntu16.04上创建matlab的快捷方式(实现方法)
查看>>
smarty使用php代码,笑谈配置,使用Smarty技术_php
查看>>
oracle数据实际值限制,c# – Oracle数据库TNS密钥“数据源”的值长度超过了’128’的限制...
查看>>
silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
背锅侠逆袭之路
查看>>
演示:使用协议分析器取证IPv6的报文结构
查看>>
oracle 11gr2 rac中的4种IP解说
查看>>
为什么你找不到工作?
查看>>
汇编语言的应用
查看>>
device platform 相应的表
查看>>
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>
实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
查看>>