多重继承

python中多重继承与获取对象

怎甘沉沦 提交于 2020-03-06 06:46:29
1、python中多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...' 看下图: 像这样,D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次: >>> d = D('d') init A... init C... init B... init D... 多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。 举个例子

C++多重继承二义性解决

邮差的信 提交于 2020-02-13 00:25:56
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(); } class C: public A, public B{ public : void g(); void h(); }; 如果声明:C c1,则c1.f();具有二义性,而c1.g();无二义性(同名覆盖)。 2. 解决办法一 -- 类名限定 调用时指名调用的是哪个类的函数,如 1 2 c1.A::f(); c1.B::f(); 3. 解决办法二 -- 同名覆盖 在C中声明一个同名函数,该函数根据需要内部调用A的f或者是B的f。如 1 2 3 4 5 6 7 8 class C: public A, public B{ public : void g(); void h(); void f(){ A::f(); } }; 4. 解决办法三 -- 虚基类(用于有共同基类的场合) virtual 修饰说明基类,如: 1 class B1: virtual public B 虚基类主要用来解决多继承时,可能对同一基类继承继承多次从而产生的二义性。为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。注意

Python中多重继承

梦想的初衷 提交于 2019-12-29 23:23:13
多重继承和方法解析顺序 python支持多继承的,下面看一个多继承的例子: class A : def ping ( self ) : print ( 'ping:' , self ) class B ( A ) : def pong ( self ) : print ( 'pong:' , self ) class C ( A ) : def pong ( self ) : print ( 'PONG' , self ) class D ( B , C ) : def ping ( self ) : super ( ) . ping ( ) print ( 'post-ping:' , self ) def pingpong ( self ) : self . ping ( ) super ( ) . ping ( ) self . pong ( ) super ( ) . pong ( ) C . pong ( self ) 上面的代码用下面的流程图记录为:其中左边为菱形UML图形,右边为上面代码的解析图; 在C上调用pong有两种方式: d = D ( ) d . pong ( ) >> > pong : < __main__ . D object at 0x0000019F560A11C8 > C . pong ( d ) #超类中的方法都可以直接调用

跟我一起学习C++虚函数--第四篇

无人久伴 提交于 2019-12-24 14:24:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在前一篇,我们讨论了在多 继承情 况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重继承,即具有重复继承的情况下的内存布局情况。在阅读本篇和下一篇之前,建议先阅读本博客另一篇博文《 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局 》。 先说一点题外话,细心的读者可能会发现,我们在探索不同情况下类的内存布局时,总是先通过查看类的大小以及其中各个成员变量的地址来进行分析,然后再具体定位某一位置的值。从最原始的内存中的对象分布,我们可以获得最深入最有效的理解。 OK,请看例子: #include <iostream> using namespace std; class Top { public: virtual void x(){cout << "top x" << endl;} virtual void print0(){cout << "top print" << endl;} public: int a; }; class Left:public Top { public: virtual void y(){cout << "left y" << endl;} virtual void print1(){cout << "left print" << endl;} public: int b;

C++ 多重继承(环状继承)

不羁岁月 提交于 2019-12-15 07:10:09
虚基类解决二义性模糊性问题 ambigous 二义性、模糊性 继承定义虚基类 (子类继承父类的时候,在父类前加 virtual) # include <iostream> using namespace std ; //基类 class Beauty { public : string name ; double height ; protected : int age ; private : double weight ; // public : Beauty ( ) { } Beauty ( string n , int a , double h , double w ) { name = n ; age = a ; height = h ; weight = w ; } void setinfo ( string n , int a , double h , double w ) { name = n ; age = a ; height = h ; weight = w ; } double get_weight ( ) { return weight ; } void show ( ) { cout << name << " " << age << " " << height << " " << weight << endl << endl ; } ~ Beauty (

COM组件的接口和对象

拟墨画扇 提交于 2019-12-07 09:48:33
一、 前言 在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其服务,由于客户与COM直接打交道的是COM接口,所以COM接口是COM最关键的要素。COM规范的核心内容就是对接口的定义,甚至可以说“在COM中接口就是一切”。组件与组件之间、组件与客户之间都要通过接口进行交互。接口成员函数将负责为客户或其他组件提供服务。与标识COM对象的CLSID类似,每一个COM接口也使用一个GUID来进行标识,该标识也被称为IID(interface identifier,接口标识符)。 二、 COM接口 COM接口通常是一组以函数的逻辑集合,继承IUnKnown接口。COM对象可以提供多个COM接口,每个接口提供不同的服务,因此COM接口与COM对象一样,都是用GUID来标识的,客户通过GUID来获取接口指针,再通过接口指针获取对应的服务。 COM接口实际限定了组件与使用该组件的客户程序或其他组件所能进行的交互方式,任何一个具备相同接口的组件都可对此组件进行相对于其他组件透明的替换。只要接口不发生变化,就可以在不影响整个由组件构成的系统的情况下自由的更换组件。通常在程序设计阶段需要将接口设计的尽可能完美,以减少在开发阶段对COM接口的更改。尽管如此,在实际应用中是很难做到这一点的

第54课.被遗弃的多重继承(下)

此生再无相见时 提交于 2019-12-06 17:00:31
1.多重继承的问题(三) 多重继承可能产生多个虚函数表 eg: #include <iostream> #include <string> using namespace std; class BaseA { public: virtual void funcA () { cout << "BaseA::funcA()" << endl; } }; class BaseB { public: virtual void funcB () { cout << "BaseB::funcB()" << endl; } }; class Derived : public BaseA, public BaseB { }; int main() { Derived d; BaseA* pa = &d; BaseB* pb = &d; // 指向同一对象的不同地方 BaseB* pbb = (BaseB*)pa; // 把pa指向到地址给到类pbb,此时pa指向到是BaseA cout << "sizeof(d) = " << sizeof(d) << endl; // 8 证明类中有两个指向虚函数表到指针。也就是 // 说 多重继承产生类多个虚函数表 // 这也是子类和父类叠加的结果 cout << "Using pa to call funcA()..." << endl; pa->funcA

第53课.被遗弃的多重继承(上)

帅比萌擦擦* 提交于 2019-12-06 14:30:40
1.c++中的多重继承 a.c++支持编写多重继承的代码 b.一个子类可以拥有多个父类 c.子类拥有父类的成员变量 d.子类继承所有父类的成员函数 e.子类对象可以当做任意杜磊对象使用(退化) 语法规则: class Derived : public BaseA, public BaseB, public BaseC { // 多重继承的本质与单继承相同 } 2.多重继承的问题一 多重继承时得到的对象可能拥有不同的地址。 #include <iostream> #include <string> using namespace std; class BaseA { int ma; public: BaseA (int a) { ma = a; } int getA () { return ma; } }; class BaseB { int mb; public: BaseB (int b) { mb = b; } int getB () { return mb; } }; class Derived : public BaseA, public BaseB { int mc; public: Derived (int a, int b, int c) : BaseA(a), BaseB(b) { mc = c; } int getC () { return mc; } void

第53课 被遗弃的多重继承

强颜欢笑 提交于 2019-12-06 07:03:50
问题: C++中是否允许一个类继承自多个父类呢? 答案是肯定的,这种现象就是多重继承 多重继承是C++中一个特有的特性,因为在其他的程序设计语言里面,如C#、java等语言只支持单重继承 C++支持编写多重继承的代码 -一个子类 可以拥有多个父类 -子类 拥有所有父类的成员变量 -子类继承 所有父类的成员函数 -子类对象可以 当作任意父类对象 使用 多重继承的语法规则 class Derived: public BaseA, public BaseB, public BaseC { // .... }; 多重继承的本质与单继承相同 #include <iostream> #include <string> using namespace std; class BaseA { int ma; public: BaseA(int a) { ma = a; } int getA() { return ma; } }; class BaseB { int mb; public: BaseB(int b) { mb = b; } int getB() { return mb; } }; class Derived : public BaseA, public BaseB { int mc; public: Derived(int a, int b, int c) : BaseA(a),

多重继承

吃可爱长大的小学妹 提交于 2019-11-29 00:07:50
在派生类的派生列表中可以包含多个基类: class Bear : public ZooAnimal { /* ... */ }; class Panda : public Bear, public Endangered { /* ... */ }; 每个基类包含一个可选的访问修饰符。一如往常,如果访问说明符被忽略了,则关键字class对应的默认访问说明符是private,关键字struct对应的是public。   和只有一个基类继承一样,多重继承的派生列表也只能包含已经被定义过的类,而且这些类只能是final的。对于派生类能够继承的基类个数,C++没有进行特殊的规定;但是在某个给定的派生类表中,同一个基类只能出现一次。 多重继承的派生类从每个基类中继承状态   在多重继承关系中,派生类的对象含有每个基类的子对象。 派生类构造函数初始化所有基类   构造一个派生类对象将同时构造并初始化它的所有基类子对象。与从一个基类进行派生一样,多重继承的派生类的构造函数初始值也只能初始化它的直接基类。 //显示地初始化所有基类 Panda::Panda(std::string name, bool onExhibit) : Bear(name, onExhibit, "Panda"), Endangered(Endangered::critical) {} /