三大特性:封装,继承,多态
封装
将数据和方法封装在一起,并加以权限区分,通过公共方法来访问私有数据。
封装性的体现
类的访问控制:
使用修饰符(public、private、protected)来控制成员变量和成员函数的访问权限。private隐藏类的内部实现细节,只允许类的成员函数进行访问和修改;public部分则定义了类对外提供的接口,可以被外部代码访问。
构造函数和析构函数:
通过构造函数和析构函数,隐藏对象的创建和销毁过程,使外部代码无需关心对象的具体管理方式.
继承
继承允许子类从父类中继承成员变量和成员函数。通过继承,子类可以获取父类的成员变量和成员函数,并且可以对其进行扩展或修改。
继承方式
继承分为三种:公共继承(public),保护继承(private),私有继承(protected)
公共继承派生类的权限
父类的公有成员在子类中保持为公有成员,父类的保护成员在子类中为保护成员,父类的私有成员在子类中无法直接访问。继承过程中权限保持不变
子类的对象可以直接访问父类的公有成员和受保护成员,但不能直接访问父类的私有成员
保护继承派生类的权限
父类的公有和保护成员在派生类中变为保护成员,父类的私有成员在子类中无法直接访问。
私有继承派生类的权限
父类的公有和保护成员在派生类中变为私有成员,父类的私有成员在子类中无法直接访问。
不能被继承的成员函数
构造函数、析构函数、operator=运算符
继承性的体现
层次结构和组织:
继承可以用于创建类的层次结构,通过将共性的属性和行为定义在基类中,派生类可以继承这些共性,并添加或修改自己特有的属性和行为。
代码重用:
继承允许派生类使用基类已有的属性和方法,避免了重复编写相同的代码。通过继承,派生类可以直接访问并使用基类的成员,减少了代码量和工作量。
继承带来的同名问题(解决该问题的最好办法是使用作用域)
子类和父类的成员变量同名,子类将默认使用自己的成员变量。
子类重定义父类的同名函数,子类将默认使用自己的成员函数。
多继承
class 子类:继承方式1 父类1,继承方式2 父类2
{
};
菱形继承
有公共祖先的多继承叫菱形继承。
虚继承
继承方式被virtual关键字修饰的,为虚继承。
多态
多态:指同一类事物以多种形式存在。多态被分为静态多态和动态多态
静态多态
静态多态:在编译阶段根据参数的类型和数量来决定调用哪个函数。
通过函数重载来实现,在同一个类中,可以有多个同名函数,但函数的参数列表不同。
动态多态
动态多态:在运行时根据对象的实际类型来调用相应的函数。
通过虚函数和继承来实现,子类重写父类的虚函数,当通过父类指针或者引用调用虚函数时,调用的是子类的重写函数。
多态性的体现
虚函数和动态绑定:
通过在父类中声明虚函数,并在子类中重写这些虚函数,实现运行时多态。当通过指向父类的指针或引用调用虚函数时,实际调用的是对应子类中的重写函数。
注:这种情况下,指向父类的指针,即可以访问父类中定义的成员,也可以调用子类中重写的虚函数。
纯虚函数和抽象类:
通过将父类中的虚函数声明为纯虚函数,使得父类成为抽象类,无法被实例化。子类必须重写这些纯虚函数才能被实例化。纯虚函数为接口提供了一种规范,子类必须实现这些函数,以保证多态性的正确性。
虚析构函数:
当父类的析构函数声明为虚函数时,可以确保通过父类指针删除子类对象时,会首先调用正确的子类析构函数,避免了内存泄漏。先析构子类,在析构父类。