精华内容
下载资源
问答
  • c++二义性
    2022-02-17 20:57:30

    什么是二义性?

    • 简单来说就是一个班级有两个同名的人都叫张三, 老师叫张三回答这道题, 这时, 谁都不知道老师指的是哪个张三, 这就是二义
    • 多重继承的二义性就是在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——同名二义性
    • 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生另一种不确定性——路径二义性。

    demo

    #include <iostream>
    #include <Windows.h>
    
    using namespace std;
    
    class Father {
    public:
    	Father() {}
    	~Father() {}
    	void play() {cout << "Father KTV唱歌!" << endl;}
    };
    
    class Mother {
    public:
    	Mother() {}
    	~Mother() {}
    	void play() {cout << "Mother 逛街购物!" << endl;}
    };
    
    class Son : public Father, public Mother{
    public:
    	Son() {}
    	~Son() {} 
    };
    
    int main(void) {
    	Son son;
    	
    	son.play(); //无法确定该调用Fther的play()还是Mother的play()
    	
    	system("pause");
    	return 0;
    }
    

     

    解决多重继承的二义性的方法1:

    使用 “类名::” 进行指定, 指定调用从哪个基类继承的方法!

        son.Father::play();
    	son.Mother::play();
    

     

    解决多重继承的二义性的方法2:

    在子类中重新实现这个同名方法, 并在这个方法内部, 使用基类名进行限定,
    来调用对应的基类方法

    class Son : public Father, public Mother{
    public:
    	Son() {}
    	~Son() {} 
    	void play() { 
    		Father::play(); 
    		Mother::play(); 
    	}
    };
    
    int main(void) {
    	Son son;
    	son.play();		//调用自己类内部重写的play()方法
    	
    	system("pause");
    	return 0;
    }
    
    更多相关内容
  • C++ 二义性是什么?怎么解决?

    万次阅读 多人点赞 2018-08-28 09:33:15
    一、什么是二义性 在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。 举个例子: class A { public: int a; // B1,B2 都...

    一、什么是二义性

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

    举个例子:

    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;
    }

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

    展开全文
  • 08_31_C++ 继承的二义性

    2022-07-01 09:24:07
    08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08...
  • 继承机制中的二义性分为:同名二义性和路径二义性。以下用两个图解释两种二义性的区别和解决方法: 或(图画的丑不要介意)如图1:D d;d.x;此时d.x指的是C的x还是D的x,即出现了同名二义性。如图2:D d;d.x;此时指...

    继承机制中的二义性分为:同名二义性和路径二义性。以下用两个图解释两种二义性的区别和解决方法:

     (图画的丑不要介意)

    如图1:

    D d;

    d.x;此时d.x指的是C的x还是D的x,即出现了同名二义性。

    如图2:

    D d;

    d.x;此时指的是B的x还是C的x,即出现了同名二义性。

    解决方法一:用类名来限定d.C::x或d.B::x

    解决方法二:同名覆盖


     

    3

    如图三:

    D d;

    d.x;此时d.x指的是A的x还是D的x,即出现了路径二义性。

    解决方法:

    引入虚基类(用于有共同基类的多继承场合(多层共祖))

    Class A

    class B : virtual public A

    class C : virtualpublic A

    class D:  public B, public C

    在子类对象中,最远基类成分是唯一的。于是下面的访问是正确的:

    D d;

    d.x;//d可以调用最远基类的成员


    /*实验题目1:多继承二义性的验证
    (1)程序功能简介
    设计一个完整程序验证多继承机制中的二义性问题。
    (2)程序设计说明
    ① 对于多继承机制中的同名二义性,分别定义三个类:A、B和C。其中,类C分别从类A和类B公有继承而来。
    在类A和类B的public区域中分别具有相同的数据成员x和成员函数showx(),类C中没有数据成员x和成员函数showx(),
    则由类C创建的一个对象c在使用数据成员x和成员函数showx()时会产生同名二义性;
    
    ② 对于多继承机制中的路径二义性,分别定义四个类:A、B、C和D。其中,类B和类C均从类A公有继承而来,类D从类
    B和类C公有继承而来。在类A的public区域中具有数据成员x和成员函数showx(),类B、C、D中没有数据成员x和成员函数
    showx(),则由类D创建的一个对象d在使用数据成员x和成员函数showx()时会产生路径二义性;
    
    ③ 为上述类分别添加合适的构造函数,实现类的各自数据成员的初始化,并分别修改代码解决上述两种二义性;
    ④ 编写完整的程序并测试。*/
    #include<iostream.h>
    class A
    {
    public:
    	int x;
    	A()
    	{
    		x=1;
    	}
    	void showx()
    	{
    		cout<<x<<endl;
    	}
    };
    //同名二义性
    /*class B
    {
    public:
    	int x;
    	showx()
    	{
    		x=2;
    		cout<<x<<endl;
    	}
    };
    class C:public A,public B
    {
    };*/
    //路径二义性
    class B:public A
    {
    };
    class C:public A
    {
    };
    class D:public B,public C
    {
    public:
    	int x;
    	D()
    	{
    		x=4;
    	}
    	void showx()
    	{
    		cout<<x<<endl;
    	}
    };
    void main()
    {
    	/*C test;
    	test.A::showx();
    	test.B::showx();*/
    	D test2;
    	test2.showx();//直接输出,输出的是D中的成员函数
    	test2.B::showx();//输出A中成员函数
    }


    展开全文
  • 1.关于二义性 在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。 第一种 类A 和类E,当F继承自 A 和 E 的时候。在F里面调用...

    1.关于二义性

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

    第一种  类A 和类E,当F继承自 A 和 E 的时候。在F里面调用他们的同名成员变量,或者同名成员函数,编译器会报错。

    有两个基类共同派生出一个子类,这两个基类中又同时存在相同的成员变量和成员函数的时候,使用域名限定符 :: 

    第二种会出现的情况,基类A ,B继承A ,C继承A,D继承 B ,C;如果D访问基类里面的成员变量和成员函数,就不知道是从B

    继承过来的还是C继承过来的。

    怎么解决,使用虚继承和虚基类。

    什么是虚继承,虚继承是指派生类共享基类的一个拷贝,共享一个基类,基类构造不会多次被调用。

    被共享的基类就叫虚基类。

     

    展开全文
  • 先来了解默认参数是什么吧!  默认参数是指在定义或声明函数时,为参数指定默认值,在调用函数时,可以传递参数,也可以不传递参数;如果没有传递参数,则在函数中使用默认参数的默认值!  对于默认参数不要...
  • 在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 有两种继承的情况会产生多义性 一、如果一个派生类从多个基类派生,而这些基类...
  • C++多继承的二义性

    2019-06-30 14:04:11
    在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 出现二义性主要有以下两种情况 情况一: 如果一个派生类从多个基类派生,...
  • 由此c++引入了,多重继承的概念,也就是允许一个派生类指定多个基类,这样就被叫做多重继承。 如下代码: #include "stdafx.h" #include <iostream> #pragma warning(disable:4996) #include <string>...
  • C++中导致二义性错误

    千次阅读 2016-01-02 16:33:24
    C++中会导致二义性错误的有两种情况: 第一种:类里面定义了两个以上的重载函数,但是其中一个重载的函数有默认值,例如:class Son { public : void print(); void print(int i=10); private : protected...
  • C++二义性语法

    2014-05-12 21:31:32
    个参数无名称,型别是一个函数,不接受任何参数,返回值为std::istream_iterator。 正确写法如下: std::deque<int> c( ( std::istream_iterator<int> (std::cin) ) , ( std::istream_iterator() ) ); ...
  • --------------------------------一、“倒三角”二义性问题------------------------------- 问题描述:卤煮之所以称之为“倒三角问题”,是因为这一类二义性问题所处的继承体系类似于倒三角形状,如图: 这样,在...
  • C++多继承中的二义性问题

    千次阅读 多人点赞 2018-05-24 17:35:46
    C++中,派生类继承基类,对基类成员的访问应该是确定的、唯一的,但是常常会有以下情况导致访问不一致,产生二义性。 1.在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——...
  • 二义性C++消除二义性

    千次阅读 2020-03-26 17:43:20
    1.二义性 二义性的定义是:“如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。”(该定义来自于百度百科)用通俗的话讲,如果一句话或者一个...
  • C++ 多继承的二义性问题 在多重继承中需要解决的主要问题是标识符不唯一即二义性问题比如 当在派生类继承的多个基类中有同名成员时派生类中就会出现标识符不唯一的情况 在多重继承中派生类由多个基类派生时基类之间...
  • MSListner 多继承QObject 和 ...如何用虚基类来处理二义性的错误? 写成: class TcpUser :virtual public QObject 或加上 class MSListner : virtual public QObject, public TcpUser QObject是不能修改的。
  • C++ 二义性问题

    万次阅读 2011-10-04 00:20:39
    二义性问题 1.在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——同名二义性。 2.当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,...
  • C++:多继承中的二义性问题

    千次阅读 热门讨论 2014-02-28 20:30:03
    情况,这时就称对基类成员的访问产生了二义性. 原因之一:  派生类在访问基类成员函数时,由于基类存在同名的成员函数,导致无法确定访问的是哪个基类的成员函数,因此出现了二义性错误。 例如: #include using...
  • C++用虚继承来消灭菱形结构二义性,解决俩爷爷的问题.zip
  • 3、多继承导致的二义性问题 当两个或者多个基类中有多个同名的成员时,如果直接访问,会产生命名冲突。 解决二义性有两个方法: 1)指明:在成员名字前面加类名和域解析法“::” d.A::m_a; 2)虚继承 多继承是指从...
  • 问题:C++菱形继承产生二义性产生的原因(解决方法及简单案例) 本程序通过VC++ 6.0编译与测试,R为A,B的父类,A,B为C的父类,具体代码如下: 菱形继承的示意图: //菱形继承产生的二义性 #include &lt;...
  • 通过对经典面绘制算法-MC算法的二义性问题进行详尽的分析,分别利用渐近线法...通过在PC机上用C++语言编程实现改进后的算法,实验结果表明,改进后的移动立方体算法的重建表面克服了经典MC算法由于二义性问题引起的缺陷。
  • 文章目录前言一、无二义性1.运算符优先级、结合性2.标识符不能以数字开头3.贪心规则、高效性1.数组下标0索引2.逻辑短路3.比较三、合乎日常习惯1.强类型2.弱类型3.比较四、相似相同规则五、总结 前言   ...
  • C++菱形继承如下: #include<iostream> using namespace std; class A { public: int a; }; class B1 : public A { public: int _B1; }; class B2 :public A { public: int _B2; }; class C :public B1, ...
  • C++ 继承中的二义性

    千次阅读 2015-02-05 08:53:39
    多重继承的派生类有可能从两个或多个基类继承同名成员,对该成员如果不加限定的话,这样使用就是二义性的。即使两个继承的函数有不同的形参表也会产生错误,类似的,即使函数在一个类中是私有的而在另一个类中是公用...
  • 在多重继承中,当在派生类中出现两个以上同名的可直接访问的基类成员时,会出现二义性,也称为访问冲突。  #include &lt;iostream&gt; using namespace std; class A { protected: int x; public: A...
  • 例如函数形参的类型是int,调用函数时却将short类型的数据交给了它,编译器就需要先将short类型转换为int类型才能匹配成功。     注意,类型提升和类型转换不是...函数重载二义性错误代码示例: #include ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,048
精华内容 20,819
关键字:

c++二义性

c++ 订阅