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. struts2 action中获取request session application的方法

    共四种方式: 其中前两种得到的是Map<String,Object>  后两种得到的才是真正的request对象 而Map就是把request对象中的属性取出做成了键值对而已. [方法一] ...

  2. UnrealEngine4入门(一) 新建一个c++项目

    epic games宣布ue4免费使用(游戏发布之后,每个季度大于3000美元则收取收益的5%)之后,吸引了大批看好VR和AR前景的游戏开发者.不过国内(中文)ue4教程和资料太少,而且一大部分资料都 ...

  3. JAVA课程设计 俄罗斯方块

    俄罗斯方块 可实现功能 1.账号管理:登录.注册 2.游戏实现:移动.旋转.消除方块统计得分.暂停游戏.暂停后继续游戏.此轮游戏未结束开启新一轮游戏.游戏未结束退出游戏. 3.排行榜:按分数排名.按局 ...

  4. CSS的基本使用

    CSS的出现就是为了将HTML的内容与样式分离 CSS的书写方式 selector{ key:value } h1{ color: blue; } <!DOCTYPE html> < ...

  5. Linux设置快捷命令

    vi ~/.bashrc 在.bashrc目录中,添加 alias 设置 例如 cdtools='cd ~/GIT/tools' 对于一条比较长的命令,如显示系统运行时长 cat /proc/upti ...

  6. Struts1文件上传

    package org.zln.struts.domain; import org.apache.struts.upload.FormFile; /** * Created by sherry on ...

  7. hdu 2874 Connections between cities (并查集+LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. P1531 I Hate It

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  9. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  10. 【BZOI 1202 狡猾的商人】

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4149  Solved: 1994[Submit][Status][Discuss] Descript ...