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. wpa_supplicant 初始化

    几个重要的结构体介绍: 1. struct wpa_interface --- Parameters for wpa_supplicant_add_iface(). wpa_interface对应网络 ...

  2. 数据结构7——BFS

    一.重拾关键 宽度优先搜索,也有称为广度优先搜索,简称BFS.类似于树的按层次遍历的过程. 初始状态:图G所有顶点均未被访问过,任选一点v. 遍历过程:假设从图中某顶点v出发,在访问了v之后依次访问v ...

  3. Spring Data学习(一):初识

    目录 前言 添加Spring Data 配置pom.xml 配置数据库相关信息(application.properties) 配置数据库信息 配置自动根据实体类在数据库创建表 创建User.java ...

  4. PAT 1005 继续(3n+1)猜想

    https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776 卡拉兹(Callatz)猜想已经在1001中 ...

  5. 算法(1)K-diff Pairs in an Array

    写在前面:研究操作系统,习惯了用C,但是在做算法题甚至构建大型系统时,C真的是噩梦.还是用C++比较好,基本算法很成熟,并可基于此实现更复杂的算法.那就边写算法边捡起来好久不用的C++吧! 题目:数组 ...

  6. Java进阶

    Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...

  7. CSS3基础选择器

    /*选择器分组:多个选择器使用同一个样式*/ h1,h2,a{ color: blue; } strong{ color: aquamarine; } /*选择器继承:body中未设置样式的会使用继承 ...

  8. 【bzoj3514】Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树

    题目描述 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 输入 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M行,代表图中的每条边 ...

  9. [CF1066C]Books Queries

    题目大意:维护一个数列,要求在左边插入一个数,在右边插入一个数,查询一个数的排名 题解:可以双指针,开个数组存每个数的位置 卡点:无 C++ Code: #include <cstdio> ...

  10. BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分

    //论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ...