1、组合与继承
组合关系:不破坏封装,整体类与局部类之间松耦合,彼此相对独立。具有较好的可扩展性。支持动态组合。在运行时,整体对象可以选择不同类型的局部对象。整体类可以对局部类进行包装,封装局部类的接口,提供新的接口。整体类不能自动获得和局部类同样的接口。创建整体类的对象时,需要创建所有局部类的对象。
继承关系:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性。支持扩展,但是往往以增加系统结构的复杂度为代价。不支持动态继承。在运行时,子类无法选择不同的父类。子类不能改变父类的接口。子类能自动继承父类的接口。创建子类的对象时,无须创建父类的对象。
2、虚函数与多态
当对某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数。被调用的函数是与绑定到指针或引用上的对象的动态类型相匹配的那一个。
OOP的核心思想是多态性。多态性这个词源自希腊语,其含义是“多种形式”。我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无需在意它们的差异。引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。
当我们使用基类的引用或指针调用基类中定义的一个函数时,我们并不知道该函数真正作用的对象是什么类型,因为它可能是一个基类的对象也可能是一个派生类的对象。如果该函数是虚函数,则直到运行时才会决定到底执行哪个版本,判断的依据是引用或指针所绑定的对象的真实类型。