精华内容
下载资源
问答
  • 多重继承顺序理解

    分析代码示例:

    #include <iostream>
    
    using namespace std;
    
    class X
    {
    	public: X()
    	{
    		cout<<"X ";
    	}
    };
    class Y 
    {
    	public: Y()
    	{
    	cout<<"Y ";
    	}
    };
    class Z 
    {
    	public: Z()
    	{
    		cout<<"Z ";
    	}
    };
    class A 
    {
    	public: A()
    	{
    		cout<<"A ";
    	}	
    };
    class B 
    {
    	public: B()
    	{
    		cout<<"B ";
    	}
    };
    class C : public B, virtual public A  
    {
    	public: C()
    	{
    		cout<<"C ";
    	}
    };
    class D : public B, virtual public A  
    {
    	public: D()
    	{
    		cout<<"D ";
    	}
    };
    class E : public C, virtual public D, virtual public Z
    {     public:
        X objX;
        Y objY;
        E()
        {
        	cout<<"E ";
        }
    };
    int main() 
    {      
    	E obj; 
    }
    
    

    输出结果:

    A B D Z B C X Y E

    按步骤debug:

    在这里插入图片描述

    多重继承的顺序分析

    主要遵循以下几点:
    1.先执行各基类的构造函数,再执行对象成员构造函数,后执行派生类构造函数
    注:
    ①处于同一层次的各基类构造函数的执行顺序与声明派生类时所指定的各基类顺序一致,而与派生类的构造函数定义中初始化列表顺序无关。
    ②若父类构造函数带有参数,必须在最远继承子类初始化列表调用。

    2.析构函数的执行顺序与构造函数相反。

    3.若同一层次中同时包含虚基类和非虚基类,先调用虚基类的构造函数,再调用非虚基类的构造函数。

    4.同一层次中的非虚基类只调用一次。

    5.如果派生类的成员与基类的某个成员同名,则派生类将在其作用域隐藏掉该基类成员。(C++ Prime 5)

    依据如上分析,则示例代码中:
    由3,找到classD
    由3,找到classA并执行A()
    由1,找到classB并执行B()
    由1,执行classD的D()
    由3,找到classZ并执行Z()
    由3,找到classC
    由4,找到classB并执行B()
    由1,找到classX并执行X()
    由1,找到classY并执行Y()
    由1,执行E()
    得到结果A B D Z C B X Y E

    展开全文
  • 主要介绍了Python多重继承的方法解析执行顺序,结合实例形式分析了Python多重继承时存在方法命名冲突情况的解析执行顺序与相关原理,需要的朋友可以参考下
  • Scala多重继承多重继承构造器执行顺序及AOP实现 内容: 1、多重继承的trait代码实战 2、多重继承构造器执行顺序 3、给予trait的AOP代码实现 该代码中PianoPlayer类继承了Human,在构造的时候按照从左到右...

    Scala多重继承、多重继承构造器执行顺序及AOP实现

    内容:

    1、多重继承的trait代码实战

    2、多重继承构造器执行顺序

    3、给予traitAOP代码实现

    该代码中PianoPlayer类继承了Human,在构造的时候按照从左到右的顺序进行构造,TTeacherPianoPlayerPianoTeacher的特性,然后覆写了TTeacher的抽象方法teach


    改代码中t2后面构造了一个匿名的内部类,有TTeacher和PianoPlayer的特征(多重继承和继承顺序)。

    在上述代码中TBeforeAfter继承了Action,所以要覆写doAction方法,因为以上代码中使用super.doAction调用父类的方法,即doAction没有具体实现,因此在覆写的时候要加上abstract和override关键字。

    AOP实现中包括了前置方法,具体实现,后工作完成后的资源清理和回收等动作。


    展开全文
  • 多重继承的构造顺序

    2019-09-26 17:26:49
    class dyh:public a,virtual public b,public c,virtual public d { public: dyh() //:a(),b(),c(),d(),s(),ss() { cout类的继承顺序\n"; } protected: dd s; ff ss; }; int main() { dyh aa; cout; }
    #include<iostream>
    using namespace std;
    
    class a{
    	public:
    		a()
    		{
    			cout<<"\na\n";
    		}
    };
    
    class b{
    	public:
    		b()
    		{
    			cout<<"\nb\n";
    		}
    };
    
    class c{
    	public:
    		c()
    		{
    			cout<<"\nc\n";
    		}
    };
    
    class d{
    	public:
    		d()
    		{
    			cout<<"\nd\n";
    		}
    };
    
    class dd{
    	public:
    		dd()
    		{
    			cout<<"\ndd\n";
    		}
    };
    
    class ff{
    	public:
    		ff()
    		{
    			cout<<"\nff\n";
    		}
    };
    
    class dyh:public a,virtual public b,public c,virtual public d
    {
    	public:
    		dyh()	//:a(),b(),c(),d(),s(),ss()
    		{
    			cout<<"\n类的继承顺序\n";
    		}
    	protected:
    		dd s;
    		ff ss;		
    };
    
    int main()
    {
    	dyh aa;
    	cout<<"\nok\n";
    }
    

     

    展开全文
  • 今天看程序员面试宝典(第三版时)时,看到一个关于多重继承的问题。题目如下 #include using namespace std; class A { int a; }; class B  { int b; }; class C : public A, public B { int c; }...

    今天看程序员面试宝典(第三版时)时,看到一个关于多重继承的问题。题目如下

    #include<iostream>
    using namespace std;

    class A
    {
    int a;
    };
    class B 
    {
    int b;
    };
    class C : public  A, public B
    {
    int c;
    };
     
    int main()
    {

    C * pc = new C;
    B * pb = dynamic_cast<B *>(pc);
    A * pa = dynamic_cast<A *>(pc);

    if(pc == pb)
        {
    cout << "equal" << endl;
        }  
        else
        {
              cout << "not equal" << endl;
        }
        if((int)pc == (int )pb)
        {
              cout << "equal" << endl;
       
        else
        {
              cout << "not equal" << endl;
        }
    cout << "pa : " << pa << endl;
    cout << "pb : " << pb << endl;
    cout << "pc : " << pc << endl;
    cout << "(int)pa : " << (int)pa << endl;
    cout << "(int)pb : " << (int)pb << endl;
    cout << "(int)pc : " << (int)pc << endl;

          return 0;

    }

    C的继承顺序若是先A后B,用vs2010测试后,结果如下:


    可以看到,pa和pc值是相同的,pb前进了4个字节,这里我是这么理解的,C的继承顺序是先A后B,故C的数据成员在内存中的排序应该是a,b,c,pc指向a的位置,pb应该指向b的位置,pa也指向a的位置,这里可以通过变换C继承的顺序来证明,若C的继承顺序是先B后A,结果如下:


    在dev c++下的测试结果,可以看到pb和pc的指向内存地址是相同的。


    再来看看两个比较的问题。继承顺序是先A后B时,pb和pc指向的内存地址不同,但是为何第一个if语句(即pc == pb)的结果输出时equal咧?

    pc == pb比较的到底是什么呢?

    按照面试宝典上的解释,比较的是pc指向的对象和(C*)隐式转换pb后pb指向的对象(pc指向的对象)的部分,指向的是同一个部分,这里倒不是很明白,希望谁看到了可以给我解释一下。

    这里写这个主要是明白了一个东西,多重继承时,继承的顺序不同,继承来的东西在子类中的存储顺序也会跟着不同,同时各父类指针发生这种强制转换时指向的地址也是按照这个排序来确定的。

    展开全文
  • 一、多重继承的trait代码实战 class Human { println("Human") } trait TTeacher extends Human { println("TTeacher") def teach } trait PianoPlayer extends Human { println("PianoPlayer") def ...
  • 2 多重继承构造器执行顺序 3 基于trait的AOP代码实战//这讲内容对做大型项目十分重要,trait本身可以有方法的实现,这样做大型工程的具体模块时,可以让这个模块混入很多不同trait,以实现这个模块功能的不同方面。...
  • 我知道对于经典类的多重继承,原则是“从左至右,深度优先”,那么我想问的是,这里面是否还和在类定义的时候的先后顺序有关? 例如按如下顺序定义:Fu1(object)、Fu2(object)、Zi1(Fu1,Fu2)、Zi2(Fu1,Fu2)、GC(Zi1,...
  • python3 类的多重继承和 python2 的经典类相差比较远,需要使用到MRO方法解析顺序。 要是顺序不对则无法正常继承。这里先简单了解。到以后有机会使用再深度学习 # 类的调用也是遵循模块调用的两种方式多重继承:...
  • scala的多重继承多重继承构造器执行顺序、基于trait的AOP实现
  • 多重继承关系的初始化顺序

    千次阅读 2017-06-26 21:12:51
    多重继承关系的初始化顺序 父类属性---》父类构造方法---》子类属性---》子类构造方法    说明:创建对象时,子类构造方法会自动调用父类的构造方法,若子类有有参构造,则不会自动调用父类无参构造...
  • 任何实现多重继承的语言都要处理潜在的命名冲突,这种冲突由不相关的祖先类实现同名方法引起的,这种冲突称为‘菱形问题’。 如下例子: class A: def ping(self): print('ping:', self) class B(A): def ...
  • 多重继承相关

    2012-03-20 14:31:38
    多重继承,执行顺序多重继承的规则,c++工程师面试题目之一
  • python允许子类继承多个基类(父类),这种特性就是通常所说的多重继承,但是在多重继承中,如何正确找到没有在当前类(或者当前子类)定义的属性。在使用多重继承的时候,有两个不同的方面要注意;1:要找到合适的...
  • 1.构造顺序是从左往右构造的 虽然TTeacher的父类是human 但是不回重复构造 2.匿名类 下面这段代码必须实现teach方法否则不能构造出来 3.如果子trait没有实现父trait 则必须用abstract|+override修饰 ...
  • c++类多重继承初始化顺序

    千次阅读 2013-08-08 13:44:56
    c++类多重继承时,初始化顺序是一个基础的问题,笔者每次清楚了以后,过段时间有点含糊了,有些基础的问题,在实际开发中,用到的频率少,今天做一个总结跟大家一起分享。 这里先讨论一般的基类继承时的初始化行为...
  • C++ 多重继承

    千次阅读 热门讨论 2021-05-13 04:17:10
    C++ 多重继承. 多重继承是什么, 多重继承的优缺点以及注意事项.
  • 在查找使用了多重继承的属性时,会将所有基类按从“最特殊”的类型到“最不特殊”的类这种顺序进行排列。然后在搜索属性时,就会按这个顺序搜索,直至找到该属性的第一个定义。可通过类的__mro__属性查看其基类的...
  • python 继承多重继承

    2017-08-17 00:15:32
    python 继承多重继承
  • C++入门经典-例8.6-多重继承的构造顺序 1:单一继承是先调用基类的构造函数,然后调用派生类的构造函数,但多重继承将如何调用构造函数呢?多重继承中的基类构造函数被调用的顺序以派生表中声明的顺序为准。派生表...
  •  在多重继承中,派生类的构造函数与单继承下派生类构造函数相似,它必须负责该派生类所有基类构造函数以及对象成员(如果有的话)构造函数的调用。同时,派生类的参数必须包含完成所有基类、对象成
  • 多重继承中,如果有两个类继承于同一个基类,要加关键字virtual说明为虚继承,以避免二义性。  继承后的子类对象成员变量的地址顺序,只与继承顺序有关。  下面为具体代码实现: #include #include using ...
  • 1.继承只会继承父类的方法,不能继承父类的变量 2.要想继承父类的变量,需要执行父类的__init__(self)方法 3.下划线开头的变量或方法,会被认为是受保护的,不能直接点出来,但如果强制打出来的话也一样能用,只是...
  • python 多重继承的方法解析顺序

    千次阅读 2017-08-30 11:22:55
    任何实现多重继承的语言都要处理潜在的命名冲突, 这种冲突由不相关的祖先类实现同名方法引起   class A: def say(self): print("A Hello:", self) class B(A): def eat(self): print("B ...
  • python 支持多继承
  • 在C++的多重继承中含有虚基类,成员对象时很容易把构造与析构的顺序弄不清楚 下面看一段代码 #include <iostream> using namespace std; class OBJ1 { public: OBJ1() { cout<<"OBJ1"<<endl; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,525
精华内容 17,810
关键字:

多重继承的顺序