菱形继承问题

#coding:utf-8  # python2中指定文件头‘‘‘1、菱形继承    当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承

2、菱形继承的问题:    python2区分经典类与新式类,如果子的继承是一个菱形继承,那么经典类与形式的区别为?        经典类下查找属性:深度优先查找        深度查找:比如A(B,C,D),深度查找就是A沿着B一路查找下去,直到世界尽头(最后一个父类),        然后才会跳到C查找,找到最后再跳到C        新式类下查找属性:广度优先查找        A(B,C,D)沿着A-B 不插着最后一个,直接跳到B,不着最后一个,跳到C,查找到最后。

3.父类又称为基类,超类。非菱形继承查找方式有两种,都是从下往上找  子类 --》 父类--》父类‘‘‘

class G(object):    # def test(self):    #     print(‘from G‘)    pass

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‘)    # pass

obj=A()print(A.mro())  # 查找顺序(很重要)# [<class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>,# <class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.G‘>, <class ‘object‘>]# obj.test() #A->B->E-C-F-D->G-object

原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9234119.html

时间: 2024-10-07 19:35:53

菱形继承问题的相关文章

C++之菱形继承

当我们谈C++时,我们谈些什么? 封装,继承,多态.这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题--菱形继承. a.菱形继承是什么 如上图,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承.这么做会引发什么问题呢,让我们来看一段代码吧! #include<iostream> using namespace std; class Base { protected: int _base; public: void fun() { cout &

C++对象内存分布(2) - 菱形继承(non virtual)

1.前言 本篇文章的所有代码例子,如果是windows上编译运行,则使用的是visual studio 2013.如果是RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686)上编译运行,则其gcc版本为4.4.7,如下所示: [[email protected] ~]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 2.菱形继承类的内存分布 2.1.类的结构 菱形继承 - 重复继承 2.2.实现

处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数

#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调用 3.处理菱形继承问题. 植物 class Botany { public: //(const string& name) // const char* name Botany(const char* name = "") :_name(name) //构造函数 { //cout

C++中的类继承之单继承&amp;多继承&amp;菱形继承

 C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可以继承多个父类的特性.多继承可以看作是单继承的扩展.派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承.多继承下派生类的构造函数与单继承下派生类构造函数相似,它必须同时负责该派生类所有基类构造函数的调用.同时,派生类的参数个数必须包

菱形继承问题(钻石问题)

在学习C++的时候,菱形继承问题绝对是一个不可避免的重点问题,那么什么是菱形继承问题呢?下图就是,长得像不像钻石?我画图确实很难看 因为C++允许多继承,当继承关系像上图这样子的时候,就会出现这样子的情况 A类是基类,B里面有个A我表示为B(A),C里面有个A我表示为C(A) 那么D里面有B和C我表示为D(B(A)C(A)) 当我们想去使用D里面的A的时候,或者说访问A的部分值,在说白了究竟哪个A才是属于D的,D中的A究竟是B的A还是C的A? 1 class A 2 {}; 3 class B

c++ 植物类 继承多态 菱形继承

#pragma once//头文件 #include <iostream> #include<string> using namespace std; // // 1.实现以下几个类的成员函数 // 2.实现一个虚函数的覆盖及调用 // 3.处理菱形继承问题. // // 植物 class Botany { public: Botany(const string&  name); virtual ~Botany(); virtual void Display(); Bota

C++对象内存分布(3) - 菱形继承(virtual)

1.前言 本篇文章的所有代码例子,如果是windows上编译运行,则使用的是visual studio 2013.如果是RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686)上编译运行,则其gcc版本为4.4.7,如下所示: [[email protected] ~]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 2.菱形继承类的内存分布 本篇文章主要讨论的是虚继承(virtual)下的内存分

菱形继承

学习了C++的继承,觉得菱形继承是比较难懂的一部分,通过了解菱形继承,我们可以了解编译器是如何工作的,下面介绍一下菱形继承在内存中的实现方式. 首先简单了解一下虚继承,下面父类和子类的大小分别是多少? class Base { public:              virtual void fun1()             {                         cout << "Base::fun1()" << endl;         

"一次实现"可以在某些场合替代菱形继承?

前不久在C++板块请教过这样一个问题:"多个基类中相同的纯虚函数,只需在派生类中实现一次"是否是标准行为.这个问题直到现在我也还没能确定,不过我在VC2005.VC2008和g++上都试过,该特性在所有这些编译器上都可以正常工作,所以应该八九不离十了.另外,记得当时星星有"语法正确逻辑说不过去"一说,那时想想确实也有些别扭.不过,最近在工作中又遇到了一个类似的问题,再加上一些突发奇想,于是产生了标题中的这个想法.考虑下面的三个类:       ClientOne通过

菱形继承的内部实现方式

问题: 由于将下图定义为多继承类型时,子类会发生二义性与数据冗余,而用菱形继承时会解决这些问题,菱形继承发生了些什么?又是怎么实现的? 本次试着说明菱形继承的机理(实现方法) 按照上图建立多继承,编写代码: class Base { public:  virtual void func1()  {   cout << "Base::func1()" << endl;  } protected:  int _a; }; class Base1: public Ba