希望通过这篇文章将C++的多态,这里主要是继承派生所引起的多态效益。
1:定义:多态就是相同的消息,不同的对象接收,会导致不同的行为
2:多态的分类
2.1:重载多态(如函数重载),强制多态(如类型转换),包含多态(主要是通过虚函数来实现),参数多态(类模板相关)
2.2:实现的角度来分,分为编译时多态和运行时多态
编译时多态是指在编译期间确定了同名的操作的具体操作对象,后者是运行时才确定。这种确定叫做绑定,也叫联编。绑定是计算机程序彼此关联的过程,就是把一个标志符和一个存储地址联系在一起的过程。编译期绑定,也称为静态绑定,或前绑定。运行时绑定称为后期绑定。(ps:这里需要补习一下编译原理了)
3:继承的访问控制
3.1:公有继承,基类的公有和保护成员中的访问属性在子类中不变,而基类的私有成员子类不能访问。
Class A;
Class B: public A;
3.2:保护继承,基类的公有和保护成员在子类中都以保护成员出现,而基类的私有成员子类不能访问。
3.3:私有继承,基类的公有和保护成员在子类中都以私有成员出现,而基类的私有成员子类不能访问。
4:类型兼容
类型兼容是指在需要基类对象的任何地方都可以用公有派生类对象来替代。
在替代之后,派生类对象就可以作为基类的对象来使用,但是只能使用从基类继承的成员(成员函数和成员变量)
5:虚基类,解决C++多继承的问题
虚基类的声明是在派生类的定义过程中进行的:
class 派生类名 : virtual 继承方式 基类名·
效果,将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中只有一个拷贝,同一个函数名也只有一个映射。
6:虚函数
虚函数的语法声明
virtual 函数类型 函数名(形参表) {
函数体;
}
虚函数只需声明在基类中就可以
虚函数是动态绑定的基础,虚函数必须是非静态的成员函数,虚函数经过派生后,在类族中就可以实现运行时多态。
虚函数申明只能出现在类定义的函数原型申明中,而不能在成员函数实现的时候。
运行时多态需要满足三个条件:1,类之间满足类型兼容;2,声明虚函数;3,由成员函数来调用或者通过指针、引用来访问虚函数。
如果不是虚函数,知识基于类型兼容,那么使用派生类的对象来代替基类的对象,再通过这个对象指针来访问成员,这样只能访问到基类的成员,无法实现多态。使用虚函数就可以使用基类的对象指针来访问派生类的成员函数,从而实现多态。
7:纯虚函数
virtual 函数类型 函数名(参数表) = 0;
纯虚函数主要是为了无法再基类中实现的函数
8:抽象类:
可以类比Java中的接口。抽象类就是就是作为一个类族的一个公共接口,来使得这个类族可以有效的发挥多态的特性。
抽象类可以定义一个对象,但是不能实例化。
如果派生类实现了抽象类的所有纯虚函数,那么这个派生类就可以实例化自己的对象,它也不再是抽象类;反之它任然是个抽象类。