组合与继承都是提高代码可重用性的手段。在设计对象模型时,可以按照语义来识别类之间的组合关系和继承关系。在有些情况下,采用组合关系或者继承关系能完成同样的任务,组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应,
继承不能支持动态继承
这个其实很好理解,因为继承是编译期就决定下来的,无法在运行时改变,如3例中,如果用户需要根据当地的情况选择计税方式,使用继承就解决不了,而使用组合结合反射就能很好的解决
继承子类不能改变父类接口
四、组合的缺点:
1、整体类不能自动获得和局部类同样的接口
如果父类的方法子类中几乎都要暴露出去,这时可能会觉得使用组合很不方便,使用继承似乎更简单方便。但从另一个角度讲,实际上也许子类中并不需要暴露这些方法,客户端组合应用就可以了。所以上边推荐不要继承那些不是为了继承而设计的类,一般为了继承而设计的类都是抽象类。
2、创建整体类的对象时,需要创建所有局部类的对象
这个可能没什么更好的办法,但在实际应用中并没有多出多少代码
如果没有虚函数【也就是virtual声明的函数】,那么C++的多态性就无法解释了,所以说,虚函数使C++具有了多态性!
一、什么是多态性?
多态性可以概括为“一个接口,多种方法”。
多态与非多态的区别在于“成员函数调用地址的早绑定和晚绑定”。“早绑定”在编译期就可以确定函数的调用地址,是静态的;“晚绑定”在运行时才能确定函数的调用地址,是动态的。
多态的作用是什么呢?在面向对象的编程中,“封装”使得代码模块化;“继承”可以扩展以存在的代码;“多态”使得接口重用。
二、多态性的c++实现:虚函数
声明基类的指针,该指针指向子类的对象。调用相应的虚函数时,可以根据子类的不同而调用不同的函数实现。因此有多态的三个条件:
1)基类指针
2)指向子类对象
3)调用的是虚函数
特殊的,对于强制类型转换,可以将子类对象的指针强制转化为基类对象的指针,
1)当以基类对象的指针调用非虚函数时,仍然调用子类的函数实现
2)当以基类对象的指针调用虚函数时,由于动态绑定,调用的是基类的函数的实现
-