菱形继承

原创 2016年08月28日 16:11:13

多继承的好坏

相对java的单一继承,cpp、python允许多继承,尤其是python还完全支持菱形继承。
这一特性,使得类继承关系变得复杂,很容易出现问题,比如菱形继承下的函数虚函数的调用混淆的问题(下面会说到)。实际开发时,很多团队也是通过文档硬性规定为单继承加自定义接口(纯虚类)。
不过也有人认为,一个语言的不应该因为一些新手常犯的问题而硬性规定、限制某些特性,比如多继承,而且cpp本身就不是面向新手的。决不决定使用多继承应该有程序员本身决定,而不应该由语言本身限定,你可以不用,但我不能没有。
这一论战属于语言设计思想层面,也没有绝对的对错。

cpp多继承

总结来说cpp在语法上是可以使用菱形继承的,但是菱形继承创建的对象无法使用多态

class A{ 
public:
    virtual void func(){ cout << "A" << endl;}
}

class B : public A{
public:
    virtual void func(){ cout << "B" << endl;}
}

class C: public A{    
public:
    virtual void func(){cout << "C" <<endl;}
}

class D: public B, C{
public:
    virtual void func(){cout << "D" <<endl;}
}

int main(){
    D d;                    // 没有问题
    d.func();             // 如果D没有重写func,会编译报错
    A* a = new D(); // 编译报错,无法使用多态
    return 0;
}

对于上面的例子,如果D没有重写func函数,后面d.func会由于不知道调用B的func还是C的func而报错。
同样的道理,在使用多态时,不知道创建一个A*指向D时,不知道使用那条继承链。


python多继承

但是python里的菱形继承却不会编译报错,经过测试对于class D(B, C),如果出现调用或继承链的混淆,那么默认选用最一个符合的的。
比如d.func(),在cpp中由于B和C都实现了func,所以出现了调用混淆。继承时(B,C),B在C前面,所以使用B.func()
由于python是动态弱类型语言,不存在cpp里面A*的问题。

#coding=utf-8
class A: # 默认继承object
    def func(self):
        print "A"

class B(A):
    def func(self):
        print "B"

class C(A):
    def func(self):
        print "C"

class D(B, C):
    pass

d = D()
print isinstance(d, D), isinstance(d, A), isinstance(d, B), isinstance(d, C), isinstance(d, object)
d.func()

相关文章推荐

C++之钻石问题和解决方案(菱形继承问题)

在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 下面的图表可以用来解释钻石问题。 假设我们有类B和类C,它们都继承了相同的类A。...
  • czjuttsw
  • czjuttsw
  • 2012年12月27日 14:17
  • 15171

菱形虚拟继承&虚函数表&对象模型

菱形继承:650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/7E/9B/wKiom1cFDbHDMc8eAAAx4qLLT30181....

【编程语言】如何解决菱形继承问题

继承、封装和多态是面向程序设计(OOP)的三大特点,而它们三者之中最具实际操作性的当属继承。通过继承可以实现简单功能的组合和定制,而多重继承更将这种能力发挥到更高的境界。不过事事都有弊端,如果使用多重...

菱形继承的二义性和数据冗余问题

什么是继承继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西。 继承的方式分为: 公有继承、保护继承、私有继承 总结: 1....

研究菱形虚拟继承和虚表(探索多态的原理)

1.继承 定义的理解         C++中存在继承机制。通过继承,我们可以利用已存在的 数据类型来定义新的数据类型,在新的数据类型中不仅有自己新定义的成员外,还包含以前以前旧的成员,即允许程序员在...

菱形虚拟继承和多态的原理

菱形虚拟继承                    菱形继承(也叫钻石继承)                          结构如下                                ...
  • Te_amo_
  • Te_amo_
  • 2017年02月15日 21:45
  • 252

分析菱形继承

C++中的继承体系,有单继承、多继承、还有复杂的菱形继承,今天我们只讨论菱形继承,以及菱形继承存在的问题,最后我们针对问题给出解决方案。 (1)什么是菱形继承? 顾名思义,菱形继承就是,几个类的继...

C++多态(二)虚表剖析以及菱形继承

虚表剖析和带有虚函数的菱形继承

C++内存分布之菱形继承(无虚函数)

菱形继承的定义是:两个子类继承同一父类,而又有子类同时继承这两个子类。例如a,b两个类同时继承c,但是又有一个d类同时继承a,b类。探究的过程还是很有趣的。 菱形继承的内存布局探究花了我几天时间,探究...
  • armwind
  • armwind
  • 2016年07月08日 19:59
  • 1455

C++中的【菱形虚继承】深入剖析

转眼间有过了一个月了,自从【C/C++语言入门篇】连载结束后,已经很久没有写博了。最近一直忙着本科毕业论文和工作上的任务,加上一个对于我来说非常重要的事情正在进行中。所以近段时间脑子一直处于绷紧状态,...
  • langsim
  • langsim
  • 2015年01月24日 22:36
  • 340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:菱形继承
举报原因:
原因补充:

(最多只允许输入30个字)