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

    函数重载以及二义性

    a, int b){} // 1 void fun(double a, double b){} // 2 // 3 当调用函数时, 编译器会分析参数类型进行传参 例如上面这段代码, 如果定义时传入形参的a和b为int类型, 则会传到函数 1 , 如果定义时传入形参a和b为double类型, 则会传到函数 2 上图可见: 调试结果, 调用了第三个重载函数, 并且c ( 9.8 ) 值强转为 int类型 ( 8 ) 相同方式测试 char 等类型也如此 函数重载二义性 问题来了!! 错误 以上这种情况就叫做二义性 解决二义性: 加入新的重载函数, 使用double类型形参 明确调用时实参强转类型: 传参前把数值强转为想要的类型 注: 编译器总是会把基本数据大的转为小的

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

    NULL与nullptr的二义性问题

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

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

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

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

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

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

    2.解决方案 Scott Meyers 在 Effective C++中提到有如下解决方案: String s((string(t))); // ok 在外部再次添加一个括号! 另外在 C++11 中也可以使用 Uniform initialization(统一初始化)来处理这种歧义: String ss{string(t)}; // ok 3.总结 这是一个经典的二义性问题

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

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

    一、虚继承原理 1、虚继承解决继承二义性问题 继承的二义性 : 如果 一个 子类 ( 派生类 ) 继承多个 父类 ( 基类 ) , 这些父类 都继承了 相同的父类 , 那么 子类 访问 父类的父类 中的成员 , 就会产生 二义性 ; 报错 : error C2385: 对“x”的访问不明确 ; 使用 " 虚继承 " 可以解决上述问题 , 子类 继承父类时 , 在 访问限定符 之前使用 virtual 关键字 }; // D 多继承 B 和 C // 分别从 B 和 C 各自继承一个来自 A 的成员 x class D : public B, public C { public: int k; }; 2二义性产生的原因分析 二义性产生的原因 : 如果 上述 B 和 C 类 没有 虚继承 A 类 ; 上述 D 对象 创建时 , 会调用 两次 A 的构造函数 , 一次由 B 对象调用 , 一次由 C 对象调用 endl; } }; int main() { D d; d.x = 10; // 控制台暂停 , 按任意键继续向后执行 system("pause"); return 0; } 2

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

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

    一、继承的二义性 1、场景说明 - 继承的二义性 A 类 是 父类 , B 类 和 C 类 继承 A 类 , 是 子类 , D 类 多继承 B 类 和 C 类 , 是 孙子类 ; 假如 A 类中有 成员变量 }; // D 多继承 B 和 C // 分别从 B 和 C 各自继承一个来自 A 的成员 x class D : public B, public C { public: int k; }; 2、 继承中的二义性报错 如果强行使用 对象.x 访问继承自 A , 会报错 error C2385: 对“x”的访问不明确 ; 定义 D 类的对象 d , 如果访问 继承自 A 类的 x 成员 , 则会出现二义性 ; 为了应对上述 继承的二义性 问题 , C++ 语言 使用 " 虚继承 " 解决 继承中的 二义性问题 ; C++ 中的 " 虚继承 " 是一种解决 多继承 带来的 菱形问题(diamond problem , 从而避免了重复定义和二义性 ; 在 C++ 中,使用虚继承的语法是在基类列表中使用 virtual 关键字 ; 2、虚继承语法 虚继承语法 : 在 继承的 访问限定符 之前 , 添加 virtual

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

    name = "yyy"; return 0; } 通过上面的运行结果我们发现,菱形继承存在两个问题:(1)二义性问题;(2)数据冗余问题。 为什么会产生二义性问题? 1.3虚继承 有了多继承就可能有菱形继承,而菱形继承又存在二义性和数据冗余等问题。所以C++就引入了虚继承来解决数据的冗余问题。 const char* name3) :Person(name3) , Student(name1, 1) , Teacher(name2, 2) { } protected: string 非虚基类初始化 Student(name1, 1)和Teacher(name2, 2)的构造函数中也会调用Person的构造函数,但由于Person是虚基类且已初始化,这些调用会被忽略。

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

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

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

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

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

    例:2.6 文法的分类对文法中的不同规则施加不同的限制,将文法和语言分为四大类0型文法:0型语言或短语结构语言1型文法:1型语言或上下文有关语言==2型文法==:2型语言或上下文无关语言2型文法是程序设计语言语法规则 如上小节给出语法树中,包含根节点S,S1,S2,S3,S4的五棵子树注意叶子结点不算子树短语短语是相对一个句型的,一个句型对应多个短语。短语就是该句型子树的叶子结点如何寻找一个句型短语? 1.画出句型语法树2.找出所有子树3.子树叶子结点组成的符号串为该句型针对子树根节点的短语4.去掉重复的短语找短语的关键还是找子树简单短语与句柄所有短语中,一步推导得来的即为简单短语。 2.9 文法的二义性若一个文法存在某个句子或句型,它存在两棵不同的语法树,则称该句子或句型是二义性的,对应的文法也是二义性的。 二义性不可判定,从底向上看,二义性意味着句柄不唯一,解决二义性的方法是,加以限制,人为避免产生二义性2.9.1 有关文法的实用限制多余规则:指文法中任何句子的推导都不会用到的规则,若有则删去- 不可到达

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

    BaseB { public: int x; }; class Derived : public BaseA, public BaseB {}; int main() { Derived d1, d2; // d1.x = d2.x; // 编译错误:'x' is ambiguous return 0; } 错误信息 5.3 显式重载赋值运算符 为避免赋值时的二义性,派生类可显式重载赋值运算符 operator=(other); // 显式调用BaseB的赋值运算符 return *this; } }; int main() { Derived d1, d2; d1.BaseA::x = 10; d1.BaseB::x = 20; d2 = d1; std::cout << "d2.BaseA::x: " << d2.BaseA ::x << std::endl; // 输出10 std::cout << "d2.BaseB::x: " << d2.BaseB::x << std::endl; // 输出20

    15410编辑于 2026-01-21
  • 高德面试:为什么Map不能插入null?

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

    43910编辑于 2024-06-06
  • 来自专栏C/C++葵花宝典

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

    { public: void base2Function() { cout << "Base2 function" << endl; } }; class Derived " << endl; } }; 在这个例子中,Derived 类同时继承自 Base1 和 Base2。 问题2二义性 二义性是指在菱形继承的情况下,派生类可能会有两个或更多的基类提供了相同的函数或数据成员,这在调用时会导致编译器无法确定调用哪个版本。 2、虚表:虚继承会在运行时为每个对象创建一个虚表,用于记录虚基类的实际地址,以便在运行时正确地访问虚基类的成员变量和成员函数。 总之,C++ 通过虚继承解决了菱形继承中的冗余性和二义性问题,使得在使用继承时更加灵活和安全。

    1K20编辑于 2024-06-22
  • 来自专栏效能与质量

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

    现在再定义一个集合U和V的连接积的概念:  UV = {αβ | α∈U,β∈V} 比如A = {a,b},B = {1,2},则AB={a1,a2,b1,b2}。很简单的概念,是不是? 举个栗子: 假设要定义一类含有+、*的算术表达式,这个定义可以这么说: 变量是一个算术表达式; 如果E1和E2是算术表达式,那么E1+E2、E1*E2、(E1)也是算术表达式。 再看有文法G2->语言L(G2)例子。 推导过程如下: 语言L(G2)-> G2 的例子。 由上面的两个例子我们可以知道,一个文法可以唯一确定一个语言,但是一个语言不一定唯一对应一个文法。 注意,文法的二义性和我们通常所说的语言的二义性不同,我们可能有两个不同的文法G1,G2,一个是二义性,一个是非二义性,但是可能L(G1) = L(G2)。 对于程序语言来说,我们常常希望它的文法是非二义性的,但是,只要我们能够控制和驾驭文法的二义性,文法二义性的存在也不一定是坏事。 现在已经证明了,文法二义性是不可判定的。

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

    C++之多继承

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

    57410发布于 2020-04-08
  • 来自专栏cs

    c++那些事儿3.0 继承

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

    69090发布于 2018-04-27
  • 编译原理期末题型

    什么是文法的二义性? 1)分成四种类型,即0型、1型、2型和3型。 2)如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性2. (2)文法的语言:文法是用于描述语言的语法结构的形式规则。文法描述的语言是该文法一切句子的集合。一个文法所描述的语言是唯一的。 5. 什么是文法的二义性? 给出一个二义性文法实例 (1)如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。 如果文法含有二义性的句子,则称该文法是二义性的 书上:若一个文法中存在某个句子,有两个不同的最左(最右)推导,则该文法是二义的。

    37810编辑于 2025-04-07
  • 来自专栏游戏开发司机

    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.3K40发布于 2021-02-03
  • 来自专栏机器学习炼丹之旅

    编译原理:第二章 文法和语言

    5.4 二义性文法 5.4.1 二义性定义 若一个文法存在某个句型对应两棵不同的语法树,则称这个文法是二义性文法。或者,若一个文法存在某个句型有两个不同的最左(最右)推导,则称这个文法是二义性文法。 二义性一般是有害的,如果一个句子具有二义性,那么对这个句子的结构可能有多种“正确”的解释。通常情况下,我们希望对每个语句的分析是唯一的。 但是,只要我们能够控制和驾驭文法的二义性,文法二义性的存在并不一定是坏事 。 对某文法,若能找出一个句子对应两棵不同的语法树,则该文法必是二义性文法。 二义性文法可以改造为无二义性文法。 G1[E]: E → E + E | E * E|( E )|i ,G1是二义性文法 G2[E]: E → E+T|T,T → T*F|F,F →(E)|i,G2(E)是无二义性文法,两者等价。

    2.5K10编辑于 2022-08-09
  • 来自专栏程序员

    C++之虚继承

    那么在多该基类中定义的成员访问时会出现二义性。C++设计虚继承来解决这个问题。虚继承的本质就是子类引用父类的内存空间,而不创建自己的内存空间。 这样既解决了多重继承可能引发的二义性问题,也使得内存得以释放。 class MyClass { public: int a; int b; }; class C1 : virtual public MyClass { public: }; class C2 : virtual public MyClass { public: }; class Last : public C1, public C2 //多继承 { }; int main() { 就不会有二义性了。 还有一种情况是这样的。 ? 这种情况下,虚继承也无法帮到我们。我们只能使用 c.A::a; c.B::a; 来明确对类成员的调用,从而避免二义性的产生。

    95620发布于 2020-04-08
  • 来自专栏c/c++

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

    2.继承与静态成员 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。 静态成员是属于类而不是对象的成员。 Student { protected: string _seminarCourse; // 研究科目 }; void TestPerson() { Student s1; Student s2; 菱形继承带来的问题 菱形继承可以带来一些问题,主要是关于数据冗余和二义性。 类和Teacher类都有相同的成员,那么当在Assistant类中调用这个成员时,会出现二义性。 ②数据冗余和二义性。 什么是菱形虚拟继承?如何解决数据冗余和二义性的? ①为了解决数据冗余和二义性问题,C++提供了虚继承的机制。

    32010编辑于 2024-07-11
领券