精华内容
下载资源
问答
  • 2019-11-20 23:07:09

    实际的业务场景中,一些事物会有多个属性。由此c++引入了,多重继承的概念,也就是允许一个派生类指定多个基类,这样就被叫做多重继承。

    如下代码:

    #include "stdafx.h"
    #include <iostream>
    #pragma warning(disable:4996)
    #include <string>
    
    using namespace std;
    
    class car{
    public:
    	car(){
    		cout << "this is car" << endl;
    	}
    	void print(void)
    	{
    		cout << "car class print" << endl;
    	}
    };
    
    class truck:public car
    {
    public:
    	truck(){
    		cout << "this is truck" << endl;
    	}
    	void truck_print(void){
    		cout << "truck::truck_print" << endl;
    	}
    };
    
    class bus:public car
    {
    public:
    	bus(){
    		cout << "this is bus" << endl;
    	}
    	void bus_print(void){
    		cout << "bus::bus_print" << endl;
    	}
    };
    
    class train :public truck, public bus{
    public:
    	train(){
    		cout << "this is train" << endl;
    	}
    	void train_print(void){
    		cout << "train::train_print" << endl;
    	}
    };
    
    int main(int argc, char *argv[])
    {
    	train test1;//多重继承的构造顺序和继承列表中基类的排列顺序一致,不是和它的初始化列表中的顺序
    //一致,所以先执行truck中的构造函数,truck先执行car的构造函数。再执行bus中的构造函数,bus中先执行
    //car中的构造函数
    	/*this is car
    this is truck
    this is car
    this is bus
    this is train*/
    	test1.train_print();//train::train_print
    	test1.truck_print();//truck::truck_print
    	test1.print();//出现二义性,print成员函数不明确。因为类bus和truck继承car的时候,都分别对
    //car中的成员函数print做了一份拷贝。train在继承bus和truck时对bus和truck多了拷贝。所以
    //test1.print()无法访问那个基类的print。
        car *p_car = &test1;//同样会产生二义性,将上面的继承按照下面的方法二,改为虚继承即可。
    
    	return 0;
    }

    消除二义性的方法:

    1.加上全局符指定使用哪一份拷贝。如:

    test1.truck::print();                
    test1.bus::print();

    2.使用虚继承,这样的话。派生类train只有一份基类car的拷贝了。如:

    将上面的

    class truck:public car
    class bus:public car

     改为:

    class truck:virtual public car
    class bus:virtual public car

     

    更多相关内容
  • 在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 有两种继承的情况会产生多义性 一、如果一个派生类从多个基类派生,而这些基类...
  • 多重继承二义性就是在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——同名二义性 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,...

    什么是二义性?

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

    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;
    }
    
    展开全文
  • 多重继承二义性

    2018-06-10 02:05:20
    先以一个例子来引入多重继承出现的问题:#include &lt;iostream&gt;using namespace std;class Person{ public : void sleep(){cout&lt;&lt;"this is a sleep function"&lt;&lt...

    先以一个例子来引入多重继承出现的问题:

    #include <iostream>

    using namespace std;
    class Person
    {
      public :
       void sleep(){cout<<"this is a sleep function"<<endl;}
       void eat(){cout<<"this is a eat function"<<endl;}
    };
    class Author:public Person
    {
      public:
       void writeBook(){cout<<"this is a writeBook function"<<endl;}
    };
    class Coder:public Person
    {
      public:
       void writecode(){cout<<"this is a writecode function"<<endl;}
    };
    class Teacher:public Author,public Coder
    {
       
    };
    int main()
    {
        Teacher t;
        t.writeBook();
        t.writecode();
        t.sleep();
        t.eat();
        return 0;

    }

    这是编译结果:


    这里就充分体现了多重继承的缺点,如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个祖先类的接口方法,就会容易出现二义性。通常有两种解决方案

    1.加上全局符确定调用哪一份拷贝,上述的程序可改为:

        t.Author::sleep();
        t.Author::eat();

    2.采用虚拟继承

    class Author:virtual public Person

    class Coder:virtual public Person

    3.虚基类的构造函数和初始化

    #include <iostream>
    using namespace std;


    class base 
    {
    protected:
      int x;
        public :
           base(int x1){
              x=x1;
              cout<<"base constructor x="<<x<<endl;
           }
    };
    class base1:virtual public base
    {


        int y;
        public :
           base1(int x1,int y1):base(x1){
              y=y1;
              cout<<"base constructor y="<<y<<endl;
           }
    };
    class base2:virtual public base
    {


        int z;
        public :
           base2(int x1,int y1):base(x1){
              z=y1;
              cout<<"base constructor z="<<z<<endl;
           }
    };
    class user:public base1,public base2
    {
       int m;
       public:
       user(int x1,int y1,int z1,int m1):base(x1),base1(x1,y1),base2(x1,z1){
         m=m1;
         cout<<"base constructor m="<<m<<endl;
       }
    };
    int main()
    {
        user t(1,2,3,4);
        return 0;
    }

    展开全文
  • 示例代码: #include<...//虚拟继承 class B : virtual public A { public: B() { a = 200; } }; //虚拟继承 class C : virtual public A { public: C() { a = 300; } }; class D : public B

    示例代码:

    #include<iostream>
    using namespace  std;
    
    class  A
    {
    public:
    
    	int  a; 
    };
    
    //虚拟继承
    class B :  virtual   public  A
    {
    public:
    	B()
    	{
    		a = 200;
    	}
    };
    
    //虚拟继承
    class C :  virtual public  A
    {
    public:
    	C()
    	{
    		a = 300;
    	}
    };
     
    
    class  D : public  B, public  C
    {
    
    };
    
    int  main()
    {
    	 
    	D  d;
    	//B,C中都有a成员变量,  D继承BC时,访问a产生二义性
    	//cout << d.a << endl;
    
    	//解决方法一,明确调用,它是多份a
    	cout << d.B::a << endl;
    	cout << d.C::a << endl;
    
    
    	//解决方法二,虚基类
    	cout << d.a << endl;//此刻只有一份a变量
    
    
    	return 0;
    }
    

    效果如下:
    在这里插入图片描述

    展开全文
  • 多重继承二义性以及解决方法

    千次阅读 2016-07-24 16:07:24
    //多重继承二义性以及解决方法 //学习目的:了解类的继承原理及多重继承二义性的解决方法。 /* //本程序代码来源《MFC权威剖析》p68 */ ////////////////////第一种多重继承二义性//////////////// ...
  • 多重继承的弊端 解决方案一: 使用"类名"::进行指定, 指定调用从哪个基类继承的方法!!! wsc.Father::dance(); wsc.Mother::dance(); 解决方案: 在子类中重新实现这个同名方法, 并在这个方法内部, 使用基类名进行...
  • 1. 什么是多重继承二义性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class A{ public:  void f(); }   class B{ public:  void f();  void g(); }   ...
  • C++多继承中的二义性问题

    千次阅读 多人点赞 2018-05-24 17:35:46
    在C++中,派生类继承基类,对基类成员的访问应该是确定的、唯一的,但是常常会有以下情况导致访问不一致,产生二义性。 1.在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——...
  • 下面程序代码,在执行时,会产生二义性错误,分析为什么会产生二义性,如何修改程序来解决二义性问题?#include #include using namespace std; class Base { protected: int a; public: Base( ) { a=5;} void ...
  •  ...多重继承:一个类派生出多个类,多个类派生出一个类 性质与规则: 1.声明方法:class D:public A,private B,protected C{} 2.调用顺序:先调用A的构造函数,再到B,再到C。虚基类->非虚基
  • C++学习笔记:多继承及其二义性问题1.多继承2.多继承二义性问题情况13.多继承二义性问题情况24.多继承二义性问题情况总结5.虚继承解决菱形继承二义性问题5.1 虚继承怎么用5.2 虚继承的实现原理 1.多继承 多...
  • 继承可能存在二义性问题:即如果继承的父类中出现同样的方法或者数据的时候,那么当子类去调用的时候会存在不知道调用谁的问题。 有问题的代码: #include <iostream> using namespace std; class ...
  • 二义性: Father.h Father.cpp Mother.h Mother.cpp Son.h Son.cpp main.cpp 总结: C++中const char * const name;char * const name;const char * name三者之间的区别? [知识点] 多继承/多重继承: ...
  • 前言:一个派生类只有一个基类,叫做单继承 一个派生类可以有两个或多个基类,叫做多继承 1、多继承 class D:public A,public B,public C { public: //类D中新增的成员 }; 2、多继承中构造函数和析构函数 在多继承...
  • 二义性问题 1.多重继承派生类 除去一个类从一个基类派生, C++还支持一个派生类同时继承多个基类。 这样理解:子女既可以继承父亲的特点,也可以继承母亲的特点 多重继承派生类的定义 如果已经定义了多个基类, ...
  • 2. 多继承会导致二义性问题 (1)场景1:多继承二义性 C多继承自A和B,则C中调用A和B的同名成员时会有二义性。 原因:C从A和B各自继承了一个同名(不同namespace域)成员,所以用C的对象来调用时编译器无法确定...
  • 继承二义性

    千次阅读 2018-10-08 09:45:22
    继承二义性主要分为两种: 调用不同基类的同名成员时可能出现二义性 访问共同基类的成员可能出现二义性 1、调用不同基类的同名成员时可能出现二义性 class A { public: void setA(int a); int get(); .....
  • C++primer620页说道:即使两个继承的函数具有不同的形参表也会产生错误...名字查找总是以两个步骤发生。但是多重继承得到的名字相同而形参列表不同的函数为什么锁雾不能认为是重载呢?它和重载之间有什么区别?
  • 多重继承造成二义性

    2017-03-20 23:13:10
    多重继承容易造成二义性(比如同时从两个类继承了函数名一样的函数,到底调用哪一个),解决方式是在调用的函数之前加上想用的类名::(d.A::hello()//调用从A类继承来的那个hello函数)。
  • 转载C++:多继承中的二义性问题 在派生类中对基类成员的访问应该是唯一的.但是,在多继承情况下,可能造成对基类中某个成员的访问出现了不一致的情况,这时就称对基类成员的访问产生了二义性. 原因一、 派生类在访问...
  • 多重继承二义性问题

    千次阅读 2010-12-17 15:10:00
    C++ 多重继承 二义性
  • C++多继承二义性

    2019-06-30 14:04:11
    在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 出现二义性主要有以下两种情况 情况一: 如果一个派生类从多个基类派生,...
  • 一个派生类的基类只有一个则称之为单继承。 多重继承:一个派生类有两...对于多重继承,c++和python等支持多重继承,但是Java是不支持的。Java 用接口解决多重继承的问题,但是不是通过多重继承这种方式做的。 声明多重
  • 转自:... 1. 什么是多重继承二义性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cla
  • c++多重继承及优缺点

    2021-07-27 19:01:58
    实际生活中,一些事物往往会拥有两个或两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子: 人(Person)可以派生出作者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,415
精华内容 4,566
关键字:

多重继承二义性