精华内容
下载资源
问答
  • 菱形继承问题

    2019-04-14 21:54:38
      在java中只允许单继承,至于原因就需要牵扯到“菱形继承问题”。 菱形继承问题   在介绍之前首先看一张图:      在上面这张图中看一看出,如果classC同时继承了classA和classB。那么如果superClass有一个...

      在java中只允许单继承,至于原因就需要牵扯到“菱形继承问题”。

    菱形继承问题

      在介绍之前首先看一张图:
      在这里插入图片描述
      在上面这张图中看一看出,如果classC同时继承了classA和classB。那么如果superClass有一个方法test();classA和classB都对该方法进行了重写,那么如果classC需要引用该方法,编译器将不能识别你要调用的是哪个父类中的方法。这就是著名的菱形继承问题。也解释了为什么java不支持多继承。

    展开全文
  • 菱形继承问题一、类的分类1.1 新式类继承了object的类以及该类的子类,都是新式类Python3中所有的类都是新式类1.2 经典类没有继承object的类以及该类的子类,都是经典类只有Python2中才有经典类二、菱形继承问题在...

    菱形继承问题

    一、类的分类

    1.1 新式类

    继承了object的类以及该类的子类,都是新式类

    Python3中所有的类都是新式类

    1.2 经典类

    没有继承object的类以及该类的子类,都是经典类

    只有Python2中才有经典类

    二、菱形继承问题

    在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D)

    如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性

    如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

    经典类下:深度优先

    广度优先:广度优先

    经典类:一条路走到黑,深度优先

    新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先

    class G(object):

    # def test(self):

    # print('from G')

    pass

    print(G.__bases__)

    class E(G):

    # def test(self):

    # print('from E')

    pass

    class B(E):

    # def test(self):

    # print('from B')

    pass

    class F(G):

    # def test(self):

    # print('from F')

    pass

    class C(F):

    # def test(self):

    # print('from C')

    pass

    class D(G):

    # def test(self):

    # print('from D')

    pass

    class A(B, C, D):

    def test(self):

    print('from A')

    obj = A()

    (,)

    obj.test() # A->B->E-C-F-D->G-object

    from A

    三、C3算法与mro()方法介绍

    python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:

    print(A.mro()) # A.__mro__

    [, , , , , , , ]

    for i in A.mro():

    print(i)

    为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

    而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

    子类会先于父类被检查

    多个父类会根据它们在列表中的顺序被检查

    如果对下一个类存在两个合法的选择,选择第一个父类

    展开全文
  • 类的分类新式类继承了object的类以及该类的子类,都是新式类Python3中所有的类都是新式类经典类没有继承object的类以及该类的子类,都是经典类只有Python2中才有经典类菱形继承问题如果继承关系为菱形结构,即子类的...

    类的分类

    新式类

    继承了object的类以及该类的子类,都是新式类

    Python3中所有的类都是新式类

    经典类

    没有继承object的类以及该类的子类,都是经典类

    只有Python2中才有经典类

    菱形继承问题

    如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

    经典类下:深度优先

    广度优先:广度优先

    经典类:一条路走到黑,深度优先

    新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先

    个人偏向下面的这个理解

    当出现了菱形继承时,新式类,先深度,当遇到了共同父类时就广度

    而经典类,就是深度优先

    当类是经典类时,多继承情况下,在要查找属性不存在时,会按照深度优先的方式查找下去

    当类是新式类时,多继承情况下,在要查找属性不存在时,会按照广度优先的方式查找下去

    不废话, 上例子!!!

    class G(object):

    da

    # print('from G')

    pass

    print(G.__bases__)

    class E(G):

    da

    # print('from E')

    pass

    class B(E):

    da

    # print('from B')

    pass

    class F(G):

    da

    # print('from F')

    pass

    class C(F):

    da

    # print('from C')

    pass

    class D(G):

    da

    # print('from D')

    pass

    class A(B, C, D):

    def test(self):

    print('from A')

    obj = A()

    (,)

    obj.test() # A->B->E-C-F-D->G-object

    mro()方法介绍

    python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:

    print(A.mro()) # A.__mro__

    for i in A.mro():

    print(i)

    [, , , , , , , ]

    为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

    而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

    子类会先于父类被检查

    多个父类会根据它们在列表中的顺序被检查

    如果对下一个类存在两个合法的选择,选择第一个父类

    展开全文
  • C++ 菱形继承问题

    2020-07-29 21:32:53
    //利用虚继承解决菱形继承,加上virtual关键字,来解决菱形继承问题(子类继承多个父类多个相同数据成员并访问需要加上作用域) class Sheep:virtual public Animal { }; class Tuo:virtual public Animal { }; ...
    #include <iostream>
    
    using namespace std;
    
    class Animal{
    
    public:
    	int m_age;	
    };
    
    
    //利用虚继承解决菱形继承,加上virtual关键字,来解决菱形继承问题(子类继承多个父类多个相同数据成员并访问需要加上作用域)
    class Sheep:virtual public Animal
    {
    };
    
    class Tuo:virtual public Animal
    {
    };
    
    class SheepTuo:public Sheep, public Tuo
    {
    };
    
    void test1()
    {
    	SheepTuo st;
    	cout<<"sizeof(st):"<<sizeof(st)<<endl;	
    
    	//当菱形继承时,两个父类拥有相同的数据成员,需要加作用域进行区分
    	st.Sheep::m_age = 18;
    	st.Tuo::m_age = 20;
    
    	cout<<"Sheep::m_age:"<<st.Sheep::m_age<<endl;
    	cout<<"Tuo::m_age:"<<st.Tuo::m_age<<endl;
    
    	//这份数据应该只需要一份就可以了,但菱形继承会出现两份,两个父类以虚继承方式,虚基类指针指向虚基类表
    	//并不需要再次加作用域
    	cout<<st.m_age<<endl;
    }
    
    int main()
    {
    	test1();
    	
    	return 0;	
    }
    
    展开全文
  • 088 菱形继承问题

    2019-09-30 12:12:00
    目录 一、类的分类 1.1 新式类 1.2 经典类 二、菱形继承问题 2.1 经典类 2.2 新式类 2.3 调用顺序 2.3.1 基类的 mro() 方法 ...
  • 目录 ... 第十一章、菱形继承问题 一、菱形继承问题 1.1 多层继承 1.2 多继承 1.3 多继承的多层继承 引用:属性查找顺序中 第十一章、菱形继承问题 一、菱形继承问题 1.1 多层继承 ...
  • 在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它?下面的图表可以用来解释钻石问题。假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。因为上述图表...
  • c++ ---菱形继承问题

    2020-10-08 16:16:53
    c++ 菱形继承问题 前言 在c++中,提供了多继承的方式,允许一个子类继承多个父类,所以就有可能会出现菱形继承问题,如下图但是会有一个问题出现,就是父亲和叔叔都继承了祖父中的一个成员,到孙子继承父亲和叔叔的...
  • 钻石问题(菱形继承问题) 和虚继承 转自:http://www.cnblogs.com/sddai/p/6516668.html 在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它?下面的图表可以用来解释钻石问题。假设我们有类B和类C...
  • java8 菱形继承问题

    千次阅读 2019-03-26 14:35:50
    java8的接口新增了默认方法的功能,这样使得接口的功能跟抽象类更为接近,不过却导致了一个菱形继承问题。 interface top{ default int face(){ return 1; } } interface middle1 extends top{ @Override ...
  • 继承和派生--多继承、菱形继承问题及解决方法1 多继承基本语法2 菱形继承问题3 菱形继承解决方法4 虚继承内部工作原理 1 多继承基本语法 class 派生类名 : [继承方式] 基类名1 , [继承方式] 基类名2 { // .... }; ...
  • 菱形继承问题 A类有public了个int Age; B类与C类都继承了A类 Son类分别继承了B类与C类 这是问题就出现了↓ 声明一个函数,函数体是赋值父类B的Age,但是编译器报错(不明确) 意思就是编译器不知道你要给父类B.Age赋值...
  • 在多重继承中存在二义性问题 我们来看第一类二义性问题: 派生类函数与基类函数重名问题: class Fa { private: int m; public: void print() { cout << "aaa" << endl; } }; class Stu1 :...
  • 一、类的分类 1.1 新式类 ...二、菱形继承问题 在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D) 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后...
  • 这时我们需要一个CD类,它需要同时继承CB和CC。问题就出现了。如果我们这样写:class CD : public CB, public CC{};那么我们在构造一个CD类的时候,其结果如下:即:一个CD类中有两个CA(它的超类的对象)这样的情况是...
  • 多继承的菱形继承问题 格式:父类名.方法名() 子类:父类名.父类方法() 父类:父类名.父类方法() 会导致多继承的菱形继承问题:父类可能被调用两次 图示菱形继承问题菱形继承问题的解决方案: super()...
  • 一、C++的菱形继承   假设有类B和类C,它们都继承了相同的类A。另外还有类D,类D通过多重继承机制继承了类B和类C。  如果直接继承会引发访问不明确(二义性),以及数据冗余。如果直接指定访问对象,可解决二义...
  • 在前边的博客中我提到过菱形继承问题,也给出了几种解决菱形继承的方法 https://blog.csdn.net/liu_zhen_kai/article/details/81590467 但是给的方法没有说明原因,这篇博客将会从内存存储模型角度,以及虚继承...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 869
精华内容 347
关键字:

菱形继承问题