菱形继承
来源:互联网 发布:全球高清网络电视重播 编辑:程序博客网 时间:2024/04/27 10:05
多继承的好坏
相对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-8class 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): passd = D()print isinstance(d, D), isinstance(d, A), isinstance(d, B), isinstance(d, C), isinstance(d, object)d.func()
0 0
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 后缀数组(三)求给定字符串不相同的子串个数(hdu 4622 区间询问)
- v8引擎
- Linux常用命令-账号管理
- 欢迎使用CSDN-markdown编辑器
- const,static,extern区别与开发使用场景
- 菱形继承
- 拓扑排序
- 什么是中间件
- 五分钟利用docker搭建好samba目录共享
- python核心编程学习笔记-2016-08-28-02-习题18-6
- 拼音自动补全第三方库jpinyin
- ThreadLocal 线程范围的共享变量
- spring boot第四节 拦截器
- mycat实现mysql读写分离