为什么现在的面向对象编程语言都取消了多重继承?
如题为什么C++有“多重继承”,但之后的面向对象编程语言都取消了“多重继承”?到底“多重继承”有什么缺点呢?还有,如果我在有很必要使用“多重继承”的情况下该如何去做呢?比...
如题
为什么C++有“多重继承”,但之后的面向对象编程语言都取消了“多重继承”?
到底“多重继承”有什么缺点呢?
还有,如果我在有很必要使用“多重继承”的情况下该如何去做呢?
比如:我想创建一个工具类,要它既有斧头又有锤子的功能,在C++中我可以让它继承斧头类,同时也继承锤子类,但在JAVA,C#等等“单继承”的语言中如何实现呢? 展开
为什么C++有“多重继承”,但之后的面向对象编程语言都取消了“多重继承”?
到底“多重继承”有什么缺点呢?
还有,如果我在有很必要使用“多重继承”的情况下该如何去做呢?
比如:我想创建一个工具类,要它既有斧头又有锤子的功能,在C++中我可以让它继承斧头类,同时也继承锤子类,但在JAVA,C#等等“单继承”的语言中如何实现呢? 展开
2个回答
展开全部
多重继承的缺点实在是太大了,就好像是核裂变一样,用好了能发电,用不好。。。
名字冲突是一个最明显的问题,比如A中有一个f()函数,B中也有一个f()函数,C继承了A和B,那么C.f(),是调用A的呢,还是B的呢?除非拙劣地写成C.A::f()。
有时候还要处理“钻石结构”的麻烦:B继承A,C继承A,D继承B和C,那么D中就会有两个A,你会说使用虚拟继承,可是,B和C的设计者不知道有D这么回事啊!所以多重继承的类的设计就很麻烦了。
多重继承的替代:使用组合就可以了,凡是可以组合的最好使用组合,然后再考虑继承。
Java中可以使用接口的方法间接实现多重继承。
名字冲突是一个最明显的问题,比如A中有一个f()函数,B中也有一个f()函数,C继承了A和B,那么C.f(),是调用A的呢,还是B的呢?除非拙劣地写成C.A::f()。
有时候还要处理“钻石结构”的麻烦:B继承A,C继承A,D继承B和C,那么D中就会有两个A,你会说使用虚拟继承,可是,B和C的设计者不知道有D这么回事啊!所以多重继承的类的设计就很麻烦了。
多重继承的替代:使用组合就可以了,凡是可以组合的最好使用组合,然后再考虑继承。
Java中可以使用接口的方法间接实现多重继承。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询