C++ 二义性是什么?怎么解决?

article/2025/10/14 20:37:00

一、什么是二义性

在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。

举个例子:

class A
{
public:int a; // B1,B2 都将继承一个变量 a
};
class B1 : public A
{
};
class B2 : public A
{
};
class C : public B1, public B2
{
};int main()
{C c;c.a = 10; // ERROR ! 二义性 !!!return 0;
}

 

二、怎么解决

1. 不使用多继承

一般来说,单继承就可以满足我们 99% 的需求了,我们应该尽量避免使用多继承带来的二义性问题。(注意:这里说的单继承不包括下面说的这种类似于 “接口” 的父类)。

由于 C++ 中不存在接口,但是可以使用只包含纯虚函数的抽象类替代,如果是只包含纯虚函数的抽象类,再多继承都将不会发生二义性(父类都没有变量了当然不会有二义性)。

2. 使用虚继承

虚继承只能解决多个父类的同名变量都是从公共基类中继承而来的情况,就是下图这种:

使用虚继承:

class A
{
public:int a;
};
class B1 : virtual public A // 虚继承
{
};
class B2 : virtual public A // 虚继承
{
};
class C : public B1, public B2
{
};int main()
{C c;c.a = 10; // OK,不会有二义性了return 0;
}

原理:使用虚继承时,C++ 编译器会做特殊处理,只会调用一个公共基类 A 的构造方法,这样就不会创建出多个同名变量 a 了。

3. 使用 “类名::变量名” 显性访问

还有一种二义性出现的场景,就是多个父类都是独立的,它们没有公共基类,这些独立的父类中存在同名变量的话,就不能使用虚继承来解决了,类似下图这样子:

这种情况,我们就只能使用 “类名::变量名” 显性访问,避免二义性了:

class B1
{
public:int a;
};
class B2
{
public:int a;
};
class C : public B1, public B2
{
};int main()
{C c;c.B1::a = 10;c.B2::a = 20;return 0;
}

同样,如果父类还存在同名方法,我们也可以使用 “类名::方法名” 这样显性调用。


http://chatgpt.dhexx.cn/article/hFh87qDv.shtml

相关文章

ES6一维数组去重,合并去重方法分享

ES6去重的几个小方法 1.使用set方法 2.setArray.from() 3.filtermap 4、Array.fromsetflatsort 排序去重 flat:对数组进行扁平化处理 sort:排序 b-a:倒序 a-b:正序 5.数组合并去重

[记录]es6常用去重方法(数组、字符串)

数组去重 ES6 ES6以下方法除了代码简洁外,对于undefined和NaN也同样可以达到去重的效果 new Set()是ES6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合,Set本身是一个构造函数,用来生成 Set 数据结构。 Set搭配扩展运算符 ……

JavaScript数组去重—ES6的两种方式

说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代码可是足…

ES6 Set() 数组去重

ES6 Set()去重 Set。它类似于数组,但是成员的值都是唯一的 通过add()方法向 Set 结构加入成员 let arr [1,2,3,4,1,5,2,3]; var set2 new Set(); arr.forEach(item>{set2.add(item) }) console.log(set2); console.log(Array.from(set2));let str [测试1,测试…

ES6数组去重的三个简单办法

ES6数组去重的三个简单办法 简单说一下利用ES6实现数组去重的三个办法。 第一种: 利用Map对象和数组的filter方法 贴上相关代码 打印后的结果 通过打印我们发现,确实实现了我们想要的效果。那么下面简单来解释一下。 1.Map对象是ES6提供的一个新的数据结构&…

一文弄懂Python中的*args 和 **kwargs

1. 引言 在本文中,我们将讨论 Python 中的 *args 和 **kwargs 及其用法和示例。 闲话少说,我们直接开始吧。 2. 问题引入 在Python中写函数的时候,我们经常需要给函数传值,这些值被称为函数参数。 我们不妨来举个栗子&#xff…

**kwargs python_python中**kwargs怎么用?

1、使用两个星号是收集关键字参数,可以将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:>>> def print_kwargs(**kwargs): ... print(kwargs) ... >>> pr…

Python技巧:​args 和 kwargs 原来这么强大

大家好,今天我给大家分享Python技巧:​args 和 kwargs的相关技巧。喜欢记得收藏、关注、点赞。 注:完整代码、资料、技术交流文末获取 现在args和 kwargs参数仍然是 Python 中非常有用的特性,而且理解它们的威力将使您成为更有效…

*args和**kwargs是什么意思

去面试的时候,做了一道笔试题——什么是*args和**kwargs,区别在哪里? 有点蒙,好像见过,但是不知道具体的意思。所以回来查了一下资料,做一下笔记。 总的来说,*args代表任何多个无名参数&#x…

埃及分数c语言设计,埃及分数(四)

最优分解 源程序 下面就是求埃及分数最优分解的 C 语言源程序 EgyptianFraction.c: 1: #include 2: #include 3: #include 4: 5: const int SIZE 64; 6: static int wp -1, bp -1; 7: static mpz_t z, w, work[SIZE], best[SIZE]; 8: static mpq_t q1, q2; 9:…

埃及分数问题

问题描述: 古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数,比如7 / 8 1 / 2 1 / 3 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。 思路: 首先要知道什么是真分数:真分数是指大于0小于1的所有分数。这些分数的特…

贪心算法之埃及分数问题

1.问题:给定一个分数,如7/8,我们可以把它表示为1/2 1/3 1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式,输入一个真分数把其分解为埃及分数之和。 2.设计思路:设分数为a/b,则cb/a,db%a,…

【数模】相关性分析

相关性:如果一个变量的变化引起了另一个变量的变化 目录 一、四种基本变量 二、 相关性分析方法 1.Pearson相关系数 2.Spearman 等级相关系数 3.Kendall tua-b 等级相关系数 4.卡方检测 5.Eta系数 *SPSS操作 三、偏相关 1.SPSS操作 2.偏相关系数和检验&…

数学建模-相关性分析及热力图

目录 一、相关性分析 二、相关性分析实例 三、三种相关系数 3.1 Pearson线性相关系数 3.2 Kendall tau系数 3.3 Spearman相关系数 4、Matlab代码 4.1 Pearson 显著性检验 4.2 Pearson 相关系数矩阵 4.3 Kendalltau相关系数矩阵 4.4 Spearman相关系数矩阵 5、代码…

R语言基础——简单相关性分析(1)

简单相关性分析(1) 简介1. 协方差和相关系数1.1 协方差1.2 相关系数 2. 相关性分析参考 简介 初次接触相关性分析,在摸索中前进,也顺便将笔记记录下来,未雨绸缪嘛! 简单来说,相关性分析就是衡量…

分类变量、有序变量与数值变量相关性分析方法总结及 R 语言应用

文章目录 一、分类 & 分类相关性分析二、有序 & 有序相关性分析三、数值 & 数值相关性分析四、分类 & 有序相关性分析五、分类 & 数值相关性分析六、有序 & 数值相关性分析 本文全部假设显著性水平为0.05,特殊说明的除外。 一、分类 & …

数据分析方法和思维—相关性分析法

01 写在前面 在数据分析的问题中, 经常会遇见的一种问题就是相关的问题, 比如抖音短视频的产品经理经常要来问留存(是否留下来)和观看时长, 收藏的次数, 转发的次数, 关注的抖音博主数等等是否有相关性, 相关性有多大。 因为只有知道了哪些因素和留存比较…

python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

本文首发地址: https://yishuihancheng.blog.csdn.net/article/details/83547648 欢迎关注我的博客【Together_CZ】,我是沂水寒城! 今天我简单地使用了scipy模块进行了统计学中三大相关性分析方法(皮尔森相关性系数、斯皮尔曼相…

数据相关性分析笔记

一、数据相关性的含义 数据类型 数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。(ppt)数值型数据、分类型数据、定序数据。 数据相关性 数据相关性是指数据之间存在某种关系&#…

ArcGIS栅格数据图层空间相关性分析方法

ArcGIS栅格数据图层空间相关性分析方法 也不知道严谨不严谨,先Mark吧欸。 矢量的空间相关分析可以通过Spatial Join以后,导出属性表到EXCEL中,进行相关分析Correlation Analysis.  而两个栅格数据图层直接能不能直接在ArcMap中进行相关分…