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都统一了,没有二义性。

【C++】多重继承的更多相关文章

  1. J a v a 的“多重继承”

    接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...

  2. java提高篇(九)-----实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  3. 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

    [源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...

  4. scala 学习笔记(06) OOP(下)多重继承 及 AOP

    一.多继承 上篇trait中,已经看到了其用法十分灵活,可以借此实现类似"多重继承"的效果,语法格式为: class/trait A extends B with C with D ...

  5. Effective C++ -----条款40:明智而审慎地使用多重继承

    多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...

  6. python基础——多重继承

    python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...

  7. python 多重继承

    多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承. 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__(self, a) ...

  8. Java提高篇——Java实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  9. C++多重继承带来的问题

    首先上图,咱们看图说话!   橙色表示变量,使用private修饰. 如图,假设Person类的变量name只能通过input方法来输入. 那么继承自Person的Student及Teacher类中s ...

  10. C++多重继承子类和父类指针转换过程中的一个易错点

    这两天有个C++新手问了我一个问题,他的工程当中有一段代码执行不正确,不知道是什么原因.我调了一下,代码如果精简下来,大概是下面这个样子: class IBaseA { public: ; int m ...

随机推荐

  1. Flask 学习笔记(二):RESTful API

    概括 URL:需要操作的对象,也就是资源 HTTP method:我要对该对象做什么(POST 增.DELETE 删.GET 查.PUT 和 PATCH 改) HTTP status code:操作的 ...

  2. HDU 4571 Travel in time(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)

    Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yu ...

  3. ACM第一阶段学习内容

    一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 .......... ...

  4. 微信公众号开发java框架:wx4j(KefuUtils篇)

    wx4j-KefuUtils介绍 函数说明:添加客服 参数:Kefu对象 返回值:微信服务器响应的json字符串 public String addKefu(Kefu kefu) 函数说明: 参数:K ...

  5. lintcode-101-删除排序数组中的重复数字 II

    101-删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 标签 数组 两根指针 脸书 思路 参照上一篇博客lintcode-100 ...

  6. Delphi GetCurrentDir 获取当前文件夹

    //获取当前文件夹 GetCurrentDirvardir: string;begindir := GetCurrentDir;ShowMessage(dir); //C:\Documents and ...

  7. (age|name|sex)+ 脱离顺序控制 并且能添加多个

    (age|name|sex)+  脱离顺序控制 并且能添加多个

  8. HTML5<canvas>标签:简单介绍(0)

    <canvas> 标签是 HTML 5 中的新标签,像所有的dom对象一样它有自己本身的属性.方法和事件, 其中就有绘图的方法,js能够调用它来进行绘图 ,最近在研读<html5与c ...

  9. Hibernate技术入门

    ORM原理 ORM(Object Relational Mapping)是对象到关系的映射,它的作用是在关系数据库和对象之间做一个自动映射,将数据库中的数据表映射成对象(持久化类),对关系型数据库以对 ...

  10. [LG1886]滑动窗口 单调队列

    ---题面--- 题解: 观察数据范围,这应该是一个复杂度O(n)的题.以最大值为例,考虑单调队列,维护一个单调递减的队列.从前向后扫,每次答案取队首,如果后面进入的比前面大,那么就弹出前面的数,因为 ...