1. 多重继承时的二义性

  当使用多重继承时,如果多个父类都定义了相同名字的变量,则会出现二义性。解决方法:使用 :: 声明作用域

#include <iostream>
using namespace std; class A
{
public:
int x;
int y;
A()
{
cout << "A 默认构造函数" << endl;
x = ;
y = ;
}
}; class B
{
public:
int x;
int y;
B()
{
cout << "B 默认构造函数" << endl;
x = ;
y = ;
}
}; class C:public A, public B
{
public:
int x;
int y;
C()
{
cout << "C 默认构造函数" << endl;
x = ;
y = ;
}
}; int main()
{
C c;
cout << c.x << endl; //
cout << c.A::x << endl; //
cout << c.B::x << endl; //
cout << c.C::x << endl; // return ;
}

2. 多个基类副本

如图所示的继承关系,如果不用虚继承会产生多个基类副本

#include <iostream>
using namespace std; class A
{
public:
int x;
int y;
A()
{
cout << "A 默认构造函数" << endl;
x = ;
y = ;
}
}; class B:public A
{
public:
B()
{
cout << "B 默认构造函数" << endl;
}
}; class C:public A
{
public:
C()
{
cout << "C 默认构造函数" << endl;
}
}; class D:public B, public C
{
public:
D()
{
cout << "D 默认构造函数" << endl;
}
}; int main()
{
D d;
//d.x = 20; 报错 x 不明确
//d.A::x = 20; 报错,基类A不明确
d.B::x = ;
cout << d.B::x << endl; //
cout << d.C::x << endl; // 1 未改变 return ;
}

注意,A的构造函数使用了两次。B和C构造函数的顺序与继承时声明的顺序相同。

3. 虚继承

在继承时使用virtual,这样就不会产生基类副本了

#include <iostream>
using namespace std; class A
{
public:
int x;
int y;
A()
{
cout << "A 默认构造函数" << endl;
x = ;
y = ;
}
}; class B: virtual public A
{
public:
B()
{
cout << "B 默认构造函数" << endl;
}
}; class C:virtual public A
{
public:
C()
{
cout << "C 默认构造函数" << endl;
}
}; class D:public B, public C
{
public:
D()
{
cout << "D 默认构造函数" << endl;
}
}; int main()
{
D d;
d.B::x = ;
cout << d.x << endl; //
cout << d.A::x << endl; //
cout << d.B::x << endl; //
cout << d.C::x << endl; // return ;
}

注意:A的构造函数只使用了一次。且所有的x都统一了,没有二义性。

最新文章

  1. Java实现Excel中的NORMSDIST函数和NORMSINV函数
  2. 异步委托(APM)使用Func异步操作,处理耗时操作
  3. Linux磁盘管理之磁盘结构、概念、原理01
  4. python&amp;MongoDB爬取图书馆借阅记录(没有验证码)
  5. &lt;转&gt;struts2中Convention中的basePackage与locators配置种种
  6. WPF 关于XDocument(xml) 的部分操作记录
  7. Android 代码编辑器中实现代码语法高亮
  8. Python学习【第十二篇】模块(2)
  9. 奥利奥好吃吗?Android 8.0新特性适配测试报告来啦!
  10. 老生常谈:关于undo表空间的使用率
  11. Java代码输出是“father”还是“child”(一)
  12. [LeetCode] Circular Array Loop 环形数组循环
  13. Xcode自定义字体不能应用的原因
  14. C#4.0 HTTP协议无法使用TLS1.2的问题
  15. 剑指offer(31)1~n整数中1出现的次数
  16. 09_组件三大属性(3)_refs和事件处理
  17. POJ-3252 Avenger
  18. ref:Spring JDBC框架
  19. lua中类的实现原理和实践
  20. Jenkins插件开发(一)--环境搭建

热门文章

  1. Pro Git - 笔记1
  2. 数据结构7——BFS
  3. week12第二轮迭代任务分配forZ.XML
  4. lintcode-76-最长上升子序列
  5. 【python】实现一个python编程的小时钟!
  6. Solr的搭建和部署
  7. 【bzoj2124】等差子序列 STL-bitset
  8. 前端工程师必须要知道的SEO技巧(2):制作比设计还要漂亮的代码(内容和语义化代码)实现下
  9. BZOJ4592 SHOI2015脑洞治疗仪(线段树)
  10. [CF1041E]Tree Reconstruction