首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏木杉の小屋

    函数重载以及二义性

    上图可见: 调试结果, 调用了第三个重载函数, 并且c ( 9.8 ) 值强转为 int类型 ( 8 ) 相同方式测试 char 等类型也如此 函数重载二义性 问题来了!! 错误 以上这种情况就叫做二义性 解决二义性: 加入新的重载函数, 使用double类型形参 明确调用时实参强转类型: 传参前把数值强转为想要的类型 注: 编译器总是会把基本数据大的转为小的

    65460发布于 2021-04-02
  • 来自专栏跟Qt君学编程

    NULL与nullptr的二义性问题

    在编程逻辑世界,有因必有果,如果一个结果含糊不定(二义性),显然是我们不想要的。C++11中引入nullptr是为了解决NULL的二义性问题。 NULL二义性的体现 void func(int) {} void func(int *) {} 当函数调用func(NULL)时会是怎样执行?

    54110发布于 2019-09-17
  • 来自专栏前端开发

    箭头函数的意义和函数的二义性

    答案只有一个:消除函数的二义性。 函数的二义性 那什么是函数的二义性呢? ){} 这个时候就会出现歧义,因为这个函数有两种调用方式: function user(){}; // 普通方式调用 user(); // 当做构造函数调用 new user(); 这就是函数的二义性 因为函数的二义性,导致 JS 函数的复杂度直线上升,因为函数在创建的时候,创建者不知道未来的调用者如何调用,可能直接调用,也有可能通过 new 方法调用,这就会存在很大的安全隐患。 new.target){ throw('Uncaught TypeError: User is not a constructor') } } 所以调用者压根就不清楚函数的调用方式,这个函数的二义性 官方一直都知道这个问题,只是一直没解决,后来ECMAScript 6在给 JS 打补丁的时候,引入了两个概念: 箭头函数 class实例 它们的作用都是为了消除函数的二义性

    34110编辑于 2025-08-08
  • 来自专栏光城(guangcity)

    C++二义性问题之Most Vexing Parse

    另外在 C++11 中也可以使用 Uniform initialization(统一初始化)来处理这种歧义: String ss{string(t)}; // ok 3.总结 这是一个经典的二义性问题

    96520发布于 2019-12-05
  • 来自专栏韩曙亮的移动开发专栏

    【C++】继承 ⑬ ( 虚继承原理 | 虚继承解决继承二义性问题 | 二义性产生的原因分析 )

    一、虚继承原理 1、虚继承解决继承二义性问题 继承的二义性 : 如果 一个 子类 ( 派生类 ) 继承多个 父类 ( 基类 ) , 这些父类 都继承了 相同的父类 , 那么 子类 访问 父类的父类 中的成员 , 就会产生 二义性 ; 报错 : error C2385: 对“x”的访问不明确 ; 使用 " 虚继承 " 可以解决上述问题 , 子类 继承父类时 , 在 访问限定符 之前使用 virtual 关键字 即可将 普通继承 改为 虚继承 ; 下面的代码中 A 是父类 ; B 类 和 C 类 虚继承 A 类 , 这样当 某个类 同时 多继承 B 类 和 C 类时 , 访问 A 类中的成员时 , 不会出现 二义性 ; 由于 B 和 C 虚继承 A , D 类访问 A 中的成员 , 不会产生二义性 ; class A { public: int x; }; // 子类 B 继承了父类 A 的 x 成员 class 二义性产生的原因 : 如果 上述 B 和 C 类 没有 虚继承 A 类 ; 上述 D 对象 创建时 , 会调用 两次 A 的构造函数 , 一次由 B 对象调用 , 一次由 C 对象调用 ; 此时 D

    57820编辑于 2023-10-27
  • 来自专栏韩曙亮的移动开发专栏

    【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )

    一、继承的二义性 1、场景说明 - 继承的二义性 A 类 是 父类 , B 类 和 C 类 继承 A 类 , 是 子类 , D 类 多继承 B 类 和 C 类 , 是 孙子类 ; 假如 A 类中有 成员变量 成员变量 x , D 类 多继承 B 类 和 C 类 , 会 分别从 B 和 C 各自 继承一个 成员变量 x ; D 类中 , 从 B , C 两个父类中继承自 爷爷类 A 的成员变量 , 会出现二义性 如果强行使用 对象.x 访问继承自 A , 会报错 error C2385: 对“x”的访问不明确 ; 定义 D 类的对象 d , 如果访问 继承自 A 类的 x 成员 , 则会出现二义性 ; // 定义 D 类对象 d D d; // 访问 继承自 A 类的 x 成员出现二义性 // 报错 error C2385: 对“x”的访问不明确 d.x = 40; 完整报错信息 : 1>--- ; 为了应对上述 继承的二义性 问题 , C++ 语言 使用 " 虚继承 " 解决 继承中的 二义性问题 ; C++ 中的 " 虚继承 " 是一种解决 多继承 带来的 菱形问题(diamond problem

    44620编辑于 2023-10-27
  • 【C++】菱形继承为何会引发二义性?虚继承如何破解?

    _name = "peter"; // 需要显示指定访问哪个基类的成员可以解决二义性问题,但是数据冗余问题无法解决 a.Student::_name = "xxx"; a.Teacher::_ name = "yyy"; return 0; } 通过上面的运行结果我们发现,菱形继承存在两个问题:(1)二义性问题;(2)数据冗余问题。 为什么会产生二义性问题? 解决二义性的办法:指定类域(是Teacher类的Person还是Student类的Person) 数据冗余问题很好理解,就是Assistant中包含了两个Person类的信息,正常情况下应该只包含一份 1.3虚继承 有了多继承就可能有菱形继承,而菱形继承又存在二义性和数据冗余等问题。所以C++就引入了虚继承来解决数据的冗余问题。

    18610编辑于 2025-12-23
  • 来自专栏韩曙亮的移动开发专栏

    【C++】多态 ⑫ ( 多继承 “ 弊端 “ | 多继承被禁用的场景 | 菱形继承结构的二义性 | 使用虚继承解决菱形继承结构的二义性 )

    有成员函数 和 成员变量 的 类 , 是不推荐的做法 , 实际开发中 , 绝对禁止 使用 上述类型的 多继承 ; 2、多继承弊端 多继承会带来一系列的问题 , 诸如 : 钻石问题 - 菱形继承结构 / 二义性错误 : 当一个类继承自多个类时 , 如果这些类有共同的基类 , 那么会出现菱形继承结构 , 也称为钻石问题 ; 该场景下 , C++ 编译器 无法确定应该使用哪个基类的成员 , 产生 二义性 ; 成员变量名相同 - 二义性错误 : 子类继承多个父类 , 父类之间没有相同的父类 , 但是 父类中 有相同名称的成员变量 , 此时也会产生二义性问题 , 需要使用域作用符访问父类中相同名称的成员 ; 破坏封装性 : ; 在 菱形继承结构 中 , 虚继承可以使 重复继承 的 父类 , 只继承 依次 ; 多继承的二义性 参考 【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 ) 博客 ; 二、代码示例 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 2、代码示例 - 使用虚继承解决菱形继承结构的二义性 在下面的 菱形继承结构 中 , D

    86320编辑于 2023-11-05
  • 来自专栏编译原理

    编译原理 第二章下: 推导,规约,句型句子,语言,文法分类,二义性

    2.9 文法的二义性若一个文法存在某个句子或句型,它存在两棵不同的语法树,则称该句子或句型是二义性的,对应的文法也是二义性的。 二义性不可判定,从底向上看,二义性意味着句柄不唯一,解决二义性的方法是,加以限制,人为避免产生二义性2.9.1 有关文法的实用限制多余规则:指文法中任何句子的推导都不会用到的规则,若有则删去- 不可到达

    96710编辑于 2024-09-20
  • 来自专栏C/C++葵花宝典

    【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题

    问题2:二义性 二义性是指在菱形继承的情况下,派生类可能会有两个或更多的基类提供了相同的函数或数据成员,这在调用时会导致编译器无法确定调用哪个版本。 例如,如果基类A和B都有一个同名的函数,而在派生类中没有明确指定调用哪一个,就会产生二义性错误。 6、多继承时的虚继承:当多个类同时virtually继承同一个虚基类时,虚基类的成员变量和成员函数在子类中只会存在一份,避免了冗余性和二义性问题。 此时,BaseClass 的成员变量 var 在 FinalChild 中只有一份,并且不会发生二义性问题。 总之,C++ 通过虚继承解决了菱形继承中的冗余性和二义性问题,使得在使用继承时更加灵活和安全。

    98820编辑于 2024-06-22
  • 高德面试:为什么Map不能插入null?

    3.1 什么是二义性问题?所谓的二义性问题指的是代码或表达式存在多种理解或解释,导致程序的含义不明确或模糊。 3.1 可证伪的HashMapHashMap 之所以不怕二义性问题的原因是,HashMap 的设计是给单线程使用的,而单线程下的二义性问题是能被证明真伪的,所以也就不存在二义性问题了(能被证明的问题就不是二义性问题 这样二义性问题就得到了解决,所以 HashMap 的二义性问题可被证明真伪,所以就不怕二义性问题,因此也就可以给 key 或者 value 设置 null 了。 ,所以二义性问题是真实存在的。 因为在你在证明二义性问题的同时,可能会有另一个线程影响你的执行结果,所以它的二义性问题就一直存在。

    40610编辑于 2024-06-06
  • 【C++高级主题】多重继承下的类作用域

    但随之而来的挑战是:多个基类的作用域重叠可能导致名字冲突(二义性,Ambiguity),例如两个基类拥有同名的成员变量或函数。 二、多重继承二义性的典型类型与代码示例 2.1 成员变量的二义性:同名变量冲突 当多个基类定义了同名的成员变量时,派生类对象访问该变量会引发二义性。 若在多重继承的多个基类作用域中找到同名的声明(无论这些声明是否等价),则视为二义性,编译器拒绝编译。 5.2 二义性对赋值的影响 若多个基类存在同名成员,且未显式覆盖,直接赋值会引发二义性二义性类型 成员变量、成员函数、虚函数、菱形继承的公共基类均可能引发二义性二义性解决方案 显式作用域限定、派生类重写成员、虚继承、using 声明。

    13410编辑于 2026-01-21
  • 来自专栏cs

    c++那些事儿3.0 继承

    避免二义性。但是最后的派生类不仅负责对直接基类初始化,还要对虚基类初始化。 ---- 看code是最有用的,细节情况已经注释说明。 } }; //D类继承B,C, 因为B,C都继承A,所以D类有2份A,这样就会出现二义性问题。 d.showId(); // 准备验证double da; 产生二义性的情况,这个就只能通过虚基类确定。 // setDa() 是会产生二义性的函数,但是A是虚基类。 // setDa() 是会产生二义性的函数,但是A是虚基类。

    68390发布于 2018-04-27
  • 来自专栏效能与质量

    侃一侃编译原理的“文法”

    四.语法分析树与二义性 我们发现从一个句型到另一个句型的推导过程不是唯一的。 比如从E->(i+i) 的过程: 对于一个文法,如果它的某些句子对应两棵不同的语法树,这个文法就属于“二义性文法”。 注意,文法的二义性和我们通常所说的语言的二义性不同,我们可能有两个不同的文法G1,G2,一个是二义性,一个是非二义性,但是可能L(G1) = L(G2)。 对于程序语言来说,我们常常希望它的文法是非二义性的,但是,只要我们能够控制和驾驭文法的二义性,文法二义性的存在也不一定是坏事。 现在已经证明了,文法二义性是不可判定的。 也就是说不存在一个算法,在有限步骤内算出一个文法是不是二义性的。我们能做的事儿,就是找一组充分条件来说明非二义性。比如,规定运算符号的优先级和结合性。

    91220发布于 2021-08-25
  • 来自专栏程序员

    C++之多继承

    而多继承一旦使用不当就会造成二义性。这可能就是其它语言都不支持多继承的原因。实际来看,几乎没有使用多继承的必要性。 下面来段代码展示一下多继承和二义性。 #include"MyClass.h" int main() { Last L; L.a; //二义性 return 0; } 编译这段代码,会有如下的错误提示。 ? 这样才不会造成二义性。 L.C1::a; L.C2::b; 基于此,C++设计了虚继承来解决上述问题的出现。

    56910发布于 2020-04-08
  • 来自专栏王磊的博客

    为什么ConcurrentHashMap不允许插入null值?

    二义性问题 所谓的二义性问题是指含义不清或不明确。 我们假设 ConcurrentHashMap 允许插入 null,那么此时就会有二义性问题,它的二义性含义有两个: 值没有在集合中,所以返回 null。 可以看出这就是 ConcurrentHashMap 的二义性问题,那为什么 HashMap 就不怕二义性问题呢? 可证伪的 HashMap 上面说到 HashMap 是不怕二义性问题的,为什么呢? 这样二义性问题就得到了解决,所以 HashMap 不怕二义性问题。 也就是说,多线程的状况非常复杂,我们没办法判断某一个时刻返回的 null 值,到底是值为 null,还是压根就不存在,也就是二义性问题不可被证伪,所以 ConcurrentHashMap 才会在源码中这样设计

    2.2K30编辑于 2022-05-09
  • 来自专栏游戏开发司机

    C++:53---菱形继承、虚继承

    最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性 缺点的解决: 数据冗余:通过下面“虚继承”技术来解决(见下) 访问不明确(二义性):通过作用域访问符::来明确调用。 如果虚基类的成员只被一条派生路径隐藏,则我们仍然可以直接访问这个被隐藏的版本 如果虚基类的成员多多个派生路径隐藏,则会产生二义性 例如,D1和D2虚继承与B,D继承于D1和D2,并且B有一个x成员: 如果D1和D2都没有x的定义:此时对x的访问不会产生二义性,因为只含有x的一个实例 如果D1中有x的定义而D2没有:同样没有二义性,派生类的x比虚基类B的x优先级更高(或者D1中没有x的定义而D2有x的定义 ) 如果D1和D2都有x的定义:对x的访问会产生二义性 ?

    1.2K40发布于 2021-02-03
  • 编译原理期末题型

    什么是文法的二义性? 1)分成四种类型,即0型、1型、2型和3型。 2)如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的 2. 例如:对于表达式的二义性文法E->E|E-E|E*E|E/E|E↑E|(E)|i 其中任何一个产生式中都不包含两个非终结符相邻的情况,因此该文法为算符文法。 4.什么是3型文法? 什么是文法的二义性?给出一个二义性文法实例 (1)如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。 如果文法含有二义性的句子,则称该文法是二义性的 书上:若一个文法中存在某个句子,有两个不同的最左(最右)推导,则该文法是二义的。

    34510编辑于 2025-04-07
  • 来自专栏学习之路

    【C++深度探索】继承机制详解(友元&&静态&&菱形继承&&虚拟继承&&组合)

    菱形继承带来的问题 菱形继承可以带来一些问题,主要是关于数据冗余和二义性。 类都有相同的成员,那么当在Assistant类中调用这个成员时,会出现二义性。 例如: int main() { // 这样会有二义性无法明确知道访问的是哪一个 Assistant a; a. Assistant a; //不虚继承就会有二义性和数据冗余 a. ②数据冗余和二义性。 (2)什么是菱形虚拟继承?如何解决数据冗余和二义性的? ①为了解决数据冗余和二义性问题,C++提供了虚继承的机制。

    44410编辑于 2024-10-15
  • 来自专栏c/c++

    【C++深度探索】继承机制详解(二)

    菱形继承带来的问题 菱形继承可以带来一些问题,主要是关于数据冗余和二义性。 类和Teacher类都有相同的成员,那么当在Assistant类中调用这个成员时,会出现二义性。 例如: void Test() { // 这样会有二义性无法明确知道访问的是哪一个 Assistant a; a. 虚继承可以解决菱形继承带来的二义性问题,确保在最终派生类Assistant中只有一份数据成员和函数。需要注意的是,虚拟继承不要在其他地方去使用。 ②数据冗余和二义性。 什么是菱形虚拟继承?如何解决数据冗余和二义性的? ①为了解决数据冗余和二义性问题,C++提供了虚继承的机制。

    30810编辑于 2024-07-11
领券