面向对象的三个基本特征: 封装 、继承 、多态
简单概括三大特性作用:
封装是为了代码模块化和增加安全性
继承是为了重用和扩展现有的代码模块
多态是为了接口复用
封装:
保护数据成员,不让类以外的程序直接访问或者修改类的成员,只能通过其成员对应方法访问(即数据封装)
隐藏方法实现的具体细节,仅仅提供接口, 内容修改不影响外部调用(即方法封装)
继承:
三种继承方式:public、protected、private。
继承的目的: 重用代码,一个类B继承另一个类A,则B就继承了A中申明的成员以及函数
派生的目的: 代码扩展,继承自一个类然后添加自己的属性和方法则实现代码的扩展
缺陷:
父类变化了子类必须变化 增加了耦合性
多态:
接口的复用,一个接口多种实现
用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数
C++多态性是通过虚函数来实现的, 虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖或者重写
函数重载为允许多个不同名称的函数,这些函数函数列表不同或者函数个数不同或者两者都不同
编译时多态:主要指方法的重载 (在编译器编译期间就可以确定函数的调用地址,并产生代码,是静态的)
运行时多态:通过虚函数实现 (在运行时确定的调用地址)
C++中,实现多态有以下方法:虚函数、抽象类(至少包含一个纯虚函数 不能创建实例)、重载、覆盖、模板。
继承时的构造函数:
(1)基类的构造函数不能被继承,派生类中需要声明自己的构造函数
(2)声明构造函数时 只需要对本类新增成员进行初始化,对继承基类成员的初始化 自动调用基类构造函数完成
(3)派生类的构造函数需要给基类的构造函数传递参数
(4)单一继承是构造函数为
派生类名::派生类名(基类所需要的形参, 本类所需要的形参):基类名(参数){本类成员初始化赋值}
(5)当基类中声明有默认形式的构造函数或未声明构造函数时 派生类构造函数可以不向基类传递参数
(6)若基类中未声明构造函数,派生类中也可以不声明 全采用缺省形式构造函数
(7) 当基类中声明有带行参的构造函数时,派生类也应该声明带形参数构造函数,并将参数传递给基类构造函数
(8)构造函数的调用顺序
a 调用基类构造函数, 调用顺序按照他们被继承是声明的顺序(从左至右)
b 调用成员对象的构造函数,调用顺序按照他们在类的声明顺序
c 派生类的构造函数体中的类容
继承时的析构函数:
(1)基类的析构函数不能继承 派生类自行声明
(2)声明方法与一般(无继承)类的析构函数相同
(3)不需要显示的调用基类的析构函数 系统会自动隐士调用
(4)析构函数的调用次序和构造函数相反
a 派生类中成员指针的析构 派生类自己析构
b 派生类成员对象析构
c 基类析构 从右到左顺序