1.二义性

二义性的定义是:“如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。”(该定义来自于百度百科)用通俗的话讲,如果一句话或者一个符号具有两种以上的解释和含义,就说明该话或者符号具有二义性。二义性意味着含义不清和不明确。

在计算机语言中,如果语言具有二义性,必须消除二义性,才能使程序正常运行。

2.C++消除二义性

C++中消除二义性的过程主要包括:1)重载消除二义性;2)和C语言混编消除二义性;3)多继承消除二义性。

1)重载消除二义性

重载是C++等面向对象语言区别于C语言等纯面向过程语言的主要特性之一(随不是面向对象语言的三大特性之一)。泛型编程依赖于重载;作为静态多态的特性也依赖于重载。

重载之所以能成功,是因为C++通过C++编译器,把同名函数转为不同的函数。也就是说,重载的同名函数,最终还是不同的函数。

C++编译器在编译的时候,编译的规则如下:把同名函数,如void test() 和  void test(int),分别改为test()或_test 和 test(int) 或_test_int。

void test(); //在编译器中改为test() 或 _test
void test(int); //在编译器中改为test(int) 或 _test_int

这种改名方法,让C++可以重载同名函数。

顺便说一下重载的意义:

1)C++是一种强类型的语言,C++要保证类型的强制性;

2)C++是一种面向对象语言,面向对象语言要使语言和抽象设计更加符合,和人类实际语言更加贴切;

3)基于上面两个原则,重载才会存在。

2)C++和C混编消除二义性

C++全部兼容了C语言的所有特性,C++是C语言的超集。但C++和C语言混编的时候,会出现各种问题。因为C语言本身不支持重载和多态,C语言的函数不存在改名或者始终是一个函数。这就会造成一个问题,如果C程序和C++混编,存在二义性问题。

严格来说,C和C++混编的二义性,不是C程序造成的,而是C++对原来的纯C函数进行了改名。改名以后,原来的C程序找不到原来的函数,就会出现问题。

为了避免该类问题,C++和C程序混编的时候,采用的方法是:C程序编译的时候,采用C语言的规则,并让C++编译器知道这部分程序是C语言的,并用C方法对C程序进行编译。

使用方法为:使用extern "C"方法,让程序明白采用了C函数。通用规则如下;

#ifdef __cplusplus
extern "C" {
#endif.......#ifdef __cplusplus
}
#endif

3)多继承消除二义性

C++支持多重继承,多重继承带来了便利,也带来了各种麻烦。(与愚蠢的C++(自嘲语,毕竟我靠C++吃饭这么长时间)相比,JAVA就避免了多重继承这个特性,并避免了这个麻烦)

C++的多重继承问题,最主要体现为菱形继承。即基类被多个衍生类继承,多个衍生类被同一个子类继承。这会继承的子类最后出问题,即某个实体的含义不清楚。

菱形继承图示如下:

这样的多重继承,在最终类D里,会无法确定成员的含义。

为了让大家理解多重继承的二义性,举个二义性的样例:

class Grand
{
public:Grand();~Grand();void fun();
};class FatherA: public Grand
{
public:FatherA();~FatherA();
};class FatherB: public Grand
{
public:FatherB();~FatherB();
};class Son: public FatherA, public FatherB
{
public:Son();~Son();
};int main(int argc, char *argv[])
{Son s;s.fun(); //二义性,因为不能确切属于哪个成员return 0;
}

为了消除该二义性,方法如下:

1)多重继承采用虚继承;

2)采用 类名称::函数,即作用域加功能方法。

4.推广

二义性问题其实在实践中广泛存在,并不仅仅属于C++和编程。这个问题属于任何领域。在工程中,消除任何意义的二义性,显然是一个工程师都应该做的。

二义性和C++消除二义性相关推荐

  1. java代码隐藏面消除算法_计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)...

    一.概述 由于投影变换失去了深度信息,往往导致图形的二义性.要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面(或可见线判定.可见面判定),或简称为消隐.经过消隐得到 ...

  2. python计算机图形学_计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)

    一.概述 由于投影变换失去了深度信息,往往导致图形的二义性.要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面(或可见线判定.可见面判定),或简称为消隐.经过消隐得到 ...

  3. 编译原理:文法及其二义性(判定及消除)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 学编译原理时,会学到文法,老师在介绍完文法的相关定义后又 ...

  4. 2.5.3 文法二义性的消除

    2.5.3 文法二义性的消除 (1 )不改变文法中原有的语法规则,仅加进一些语法的非形式规定. 例如,对于上例文法 G [ E ],不改变已有的 4 条规则,仅加进运算符的优先顺序和结合规则,即 * ...

  5. c++中多重继承二义性产生以及二义性的消除方法

    实际的业务场景中,一些事物会有多个属性.由此c++引入了,多重继承的概念,也就是允许一个派生类指定多个基类,这样就被叫做多重继承. 如下代码: #include "stdafx.h" ...

  6. 如何消除文法的二义性

    文法举例 显然,对于not p and q有两种推导方式 默认not优先级高于and,即(not p) and q 默认and优先级高于 not,即not(p and q) 先and再not 先not ...

  7. 什么叫虚继承(虚拟继承)?如何消除继承中的二义性?

    乍听虚继承,吓倒很多人!! 或许很多人会认为这和虚函数有关,其实,几乎没有任何关系.它的出现,是为了克服继承中一个非常棘手的问题,也就是臭名昭著的菱形继承(二义性)问题. 二义性,也就是说,假如我们有 ...

  8. C++考研复试面试题

    C++考研复试面试题总结 第一章 面向对象程序设计概述 1.什么是结构化程序设计方法?有哪些优点和缺点? 2.什么面向对象程序设计方法?有哪些优点? 3.面向对象与面向过程程序设计有哪些不同点? 4. ...

  9. 计算机图形学+简单算法实现,《计算机图形学》课程设计-简单几何体的消隐算法实现.doc...

    PAGE PAGE 18 PAGE 18 课程名称:<计算机图形学> 论文题目:简单几何体的消隐算法实现 教学部: 年 级: 班 级: 学 号: 姓 名: 简单几何体的消隐算法实现 摘 要 ...

最新文章

  1. ADO.NET中连接池状态的跟踪
  2. 使用表达式自定义Serilog输出格式
  3. python 实现语音转文字_python3实现语音转文字(语音识别)和文字转语音(语音合成)...
  4. java中nonce_java如何获取微信timestamp,nonceStr,signature参数
  5. 【python】python中execl的操作
  6. RobotStudio碰撞检测的设定
  7. 基于BlueZ 的BLE蓝牙开发
  8. 统计学名词解释 —— 3. 「简单随机样本」、「联合分布」与「联合密度」
  9. CCProxy+Proxifier代理手机连接电脑(玩网游)支持VIST(防QQ不掉线)本文转载
  10. 黑马程序员——Java基础--IO(一)
  11. 腾讯linux集成化界面,腾讯TOS系统今日开启内测:界面扁平化风格
  12. MFC架构之CWnd类
  13. c# 微信公众号开发之token验证第三方服务器
  14. 数据分析体系 - 用户粘性(DAU/MAU 和 月人均活跃天数)
  15. MVPArch - Android MVP 快速开发框架
  16. 爱康科技子爱康科技山西孝义30MW光伏发电项目并网发电
  17. 云服务器连接手机本地文件夹,云服务器连接手机本地文件
  18. 联想凌拓:谁更如愿以偿呢?
  19. [精易软件开发工程师Leo学习笔记]005数组
  20. 2022-2-9 Leetcode 925.长按键入

热门文章

  1. 个人网站---利用WordPress搭建个人网站
  2. Matlab课后笔记之霍夫变换(Hough Transform)
  3. 重生之我是赏金猎人-SRC漏洞挖掘(十三)-攻防对抗/梦中绝杀X脖代理商
  4. 同步练习(Java SE(十二))
  5. 高德定位慢 - iOS
  6. java mysql连接池配置_Java数据库连接池的几种配置方法(以MySQL数据库为例)
  7. 机器学习(二)-朴素的贝叶斯分类
  8. python爬虫---12306获取列车座位信息
  9. 猎聘网推出移动互联求职新方式
  10. 安科瑞ACX电瓶车智能充电桩,支付方式可选择刷卡、扫码、免费充电使用,设备内部可引出10路出线至专用插座