多重继承有什么缺陷
2014-01-16 11:46
267 查看
在《设计模式》一书中,作者在开篇中就提出了面向对象的两条基本设计原则:
1、多对接口编程,少对实现编程。
2、多使用聚合,少使用继承。
继承的过多使用当然会带来高耦合,当然聚合的过分会使模块过多。
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能,是一种图状层次结构(有向无环图)。功能强大,但易引起二义性,占用内存比较多。有时多重继承会出现二义性,比如
class A{ protected: bool flag;}
class B : public A{}
class C : public A{}
class D : public B, public C{
public:
vid setFlag(bool nflag){
flag=nflag;//这里出现了flag两个版本,因为在D的继承层次中有两个A的实例。编译器会指出对flag引用存在的二义性。一种方法是显示消除引用的二义性:B::flag=flag;另一种方法是将B和C声明为虚基类,这意味着类层次中将只存在一份A的拷贝。
}
}//多继承还存在其他复杂问题,如:构造派生对象时基类的初始化顺序,以及成员会不小心再派生类中隐藏的问题。
1、多对接口编程,少对实现编程。
2、多使用聚合,少使用继承。
继承的过多使用当然会带来高耦合,当然聚合的过分会使模块过多。
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能,是一种图状层次结构(有向无环图)。功能强大,但易引起二义性,占用内存比较多。有时多重继承会出现二义性,比如
class A{ protected: bool flag;}
class B : public A{}
class C : public A{}
class D : public B, public C{
public:
vid setFlag(bool nflag){
flag=nflag;//这里出现了flag两个版本,因为在D的继承层次中有两个A的实例。编译器会指出对flag引用存在的二义性。一种方法是显示消除引用的二义性:B::flag=flag;另一种方法是将B和C声明为虚基类,这意味着类层次中将只存在一份A的拷贝。
}
}//多继承还存在其他复杂问题,如:构造派生对象时基类的初始化顺序,以及成员会不小心再派生类中隐藏的问题。
相关文章推荐
- struts2中的action为什么要继承ActionSupport类,不继承也可以,有什么好处?
- 关于为什么在有继承关系的类结构中,析构函数destructor要是virtual以及如果不是会发生什么
- asp.net 中类,继承,抽象类,接口的定义方法?还有区别是什么?
- Object.create() 是什么?继承(继承特定的)
- java中类继承,到底继承了什么?
- windows moblie wtl 从CStdDialogImpl继承的窗口,domodal出来,任务栏中的叉,点了叉不知道触发了什么事件。临时解决办法,隐藏它
- 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
- 什么是继承于Java的下面是一个深入的研究
- C++继承与派生的概念、什么是继承和派生
- 《Java程序猿面试笔试宝典》之组合与继承有什么差别
- java中到底什么是继承?
- 对于多线程类 实现Runnable接口和继承Thread类有什么区别
- Intel 设计缺陷背后的原因是什么? | Linux 中国
- 组合与继承有什么区别
- 继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
- 什么是好用的缺陷报告记录
- readOnly、const这两者的区别及继承中为什么父类中的方法被重写后之后系统做了什么事?
- fork之后,子进程从父进程那继承了什么
- static静态方法可以被继承吗?Student a= new Student(); new一个对象的过程发生了什么?
- java中什么是继承笔记