1 .二义性
二义性的定义是“当语法g的某个句子中存在多个语法树时,该句子被称为二义性。 如果语法包含二义性句子,则说该语法是二义性的。 ”这个定义来自百度百科)用一般的话来说,如果一个词或符号有两个以上的解释和意义,那么这个词或符号就具有二义性。 二义性意味着意思不明确和不明确。
在计算机语言中,如果语言具有二义性,为了使程序正常运行就必须消除二义性。
2 .消除c二义性
C消除二义性的过程主要有:1)重载消除二义性; 2 )与c语言混编消除二义性3 )多继承消除二义性。
1 )重载消除二义性
重载是c等面向对象语言区别于c语言等纯面向过程语言的主要特性之一。 通用编程作为依赖重负荷的静态多态性的特性也依赖于重负荷。
重载成功是因为C通过C编译器将同名函数转换成了不同的函数。 这意味着重载的同名函数最终将是不同的函数。
c编译器在编译时,将相同名字的函数,例如void test 和void test ) int,分别变更为test )或者_test和testint )或者_test_int的规则
void test ; //在编译器中更改为test 或_testvoidtest ) int//在编译器中更改为testint )或_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 } # endif3)许多继承消除二义性
C支持多重继承,多重继承带来了便利,也带来了各种麻烦。 愚蠢的c )自嘲语,毕竟我在c吃了这么长时间的饭)相比,JAVA避免了多重继承这个特性,避免了这个麻烦) )。
C的多重继承问题,主要表现为菱形继承。 这意味着基类由多个派生类继承,而多个派生类由同一子类继承。 继承的子类最后会出问题。 也就是说,实体的含义不明确。
菱形继承图标如下:
这样的多重继承,在最终类d中无法确定成员的意思。
为了让大家理解多重继承的二义性,我们举二义性的例子:
类接地{ public : grand ; ~Grand ; void fun ; ; classfathera :公共接地{公共: fathera ; ~FatherA ; ; classfatherb :公共接地{公共: fatherb ; ~FatherB ; ; class Son: public FatherA,public FatherB{public: Son ); ~Son ; ; intmainintargc,char *argv[] ) { Son s; s.fun ; //因为二义性不准确属于任何成员的return 0; }要消除该二义性,有以下方法。
1 )多重继承采用虚继承
2 )采用类名:函数,即作用域加功能方法。
4 .推广
二义问题其实在实践中广泛存在,不仅仅是c和编程。 这个问题属于任何领域。 在工程中,消除任何意义的二义性,显然是一个工程师应该做的。