C++实现面向对象的三个基本工具是:封装、继承、多态。
- 封装:隐藏实现细节,仅对外提供接口,即实现了代码模块化;
- 继承:扩展已存在的代码模块(类),即实现了代码重用。
- 多态:具体表现为一个接口,多种方法,即实现了接口重用!
继承
一个对象直接使用另一个对象的属性和方法。
优点:
- 减少重复的代码。
- 继承是多态的前提。
- 继承增加了类的耦合性。
缺点:
- 继承在编译时刻就定义了,无法在运行时刻改变父类继承的实现;
- 父类通常至少定义了子类的部分行为,父类的改变都可能影响子类的行为;
- 如果继承下来的子类不适合解决新问题,父类必须重写或替换,那么这种依赖关系就限制了灵活性,最终限制了复用性。
多态
多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。当多态应用形参类型的时候,可以接受更多的类型。当多态用于返回值类型的时候,可以返回更多类型的数据。多态可以让你的代码拥有更好的扩展性。
多态分两种分别为静态多态和动态多态:
- 静态多态(编译期多态):静态多态大多使用重载、模板和宏,因为是在编译期决议确定,所以称为静态多态。
- 动态多态(运行期多态):动态多态就是通过继承重写基类的虚函数实现的多态,因为是在运行时决议确定,所以称为动态多态。
重载 & 重写 & 重定义的概念
重载 overload(同域,同名,参数不同,返回值任意)
- 函数名相同,参数列表不同。
- 重载只是在类的内部,或者说在同一作用域存在。
- 但是不能靠返回类型来判断。重载虽然函数名一样,但是对于编译器来说其实是不同的函数,重载包括传入参数个数不同,类型不同等,不能通过返回值不同来判断。
重写 override(不同域,同名,参数相同,返回值相同)派生类函数覆盖同名基类函数
- 被重写的函数不能是static的。必须是virtual的
- 重写函数必须有相同的类型,名称和参数列表
- 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的
重定义 (redefining) (不同域,同名,参数&返回值任意)派生类函数隐藏同名基类函数
- 子类重新定义父类中有相同名称的非虚函数
- 参数列表和返回类型可以不同
封装
隐藏对象的属性和实现细节,仅仅对外提供接口和方法。
优点: 1)隔离变化;2)便于使用; 3)提高重用性; 4)提高安全性
缺点: 1)如果封装太多,影响效率; 2)使用者不能知道代码具体实现。