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. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

  2. ps aux 和ps -aux和 ps -ef的选择

    转载自:足至迹留 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想 ...

  3. Spark分布式执行原理

    Spark分布式执行原理 让代码分布式运行是所有分布式计算框架需要解决的最基本的问题. Spark是大数据领域中相当火热的计算框架,在大数据分析领域有一统江湖的趋势,网上对于Spark源码分析的文章有 ...

  4. hdu 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. [洛谷P1407][国家集训队]稳定婚姻

    题目大意:有$n$对夫妻和$m$对情人,如果一对情人中的两人都离婚了,那么他们可以结为夫妻.对于每一对夫妻,若他们离婚后所有人依然可以结婚,那么就是不安全的,否则是安全的.问每一对夫妻是否安全. 题解 ...

  6. poj3375 Network Connection

    Description There are \(M\) network interfaces in the wall of aisle of library. And \(N\) computers ...

  7. C++——类继承以及类初始化顺序

    对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可 ...

  8. poj2814-拨钟问题-C语言-枚举算法

    #include <stdio.h> #include <stdlib.h> /* 首先,我们考虑用长度为9的数组表示表盘的状态以及调表的操作,终止的条件是表盘状态数组所有元素 ...

  9. 运用yunwei.zip压缩包安装过程:

    12   yum install lrzsz -y     13  rz    14  ll    15  unzip -o yunwei.zip     16  unzip yunwei.zip  ...

  10. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) B

    B. Little Artem and Grasshopper time limit per test 2 seconds memory limit per test 256 megabytes in ...