C++语言是C语言的拓展,C语言是面向过程的,C++在C的基础上增加了面向对象的方法
什么是面向对象呢,面向对象就是将数据和对数据的加工方法打包在一起,进行模块化的调用,通过方法来进行数据交换的一种设计方法
Tip: 本人关于程序的认知,可以参看前面写的 一个运维人员的编程思维
面向对象的程序设计有四个主要特点:
下面就通过C++来对面向对象的核心特性进行分享
Tip: 此文中的基础概念参看了 《C++ 虚函数&纯虚函数&抽象类&接口&虚基类》 《C++抽象基类和纯虚函数》
在面向对象语言中,接口的多种不同实现方式即为多态
多态特性中,可以将子类类型的指针赋值给父类类型的指针;可以用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数
多态是通过虚函数实现的
多态可以让父类的指针有“多种形态”,这是一种泛型技术(所谓泛型技术,就是试图使用不变的代码来实现可变的算法)
虚函数是一种特殊的成员函数,它的一般格式如下
class <类名>
{
virtual <类型><函数名>(<参数表>);
…
};
虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数进行重新定义。在派生类中定义的函数应与虚函数具有相同的形参个数和形参类型(覆盖),以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数
虚函数可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类虚成员函数调用基类指针,则会调用其真正指向的对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向哪个派生类对象,调用时都会调用基类中定义的那个函数
Tip: 虚函数的引入就是为了实现多态的特性,让不同的子类可以有不同的实现方式
纯虚函数是一种特殊的虚函数,它的一般格式如下
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
许多情况下,在基类中不能对虚函数给出有意义的实现,则把它声明为纯虚函数,它的实现留给该基类的派生类去做
纯虚函数的作用是为派生类提供一个一致的接口(纯虚函数相当于接口,不能直接实例化,需要派生类来实现函数定义)
带有纯虚函数的类称为抽象类
抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限
抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的
抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类
抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个 抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了
抽象类中,既可以有抽象方法,也可以有具体方法或者叫非抽象方法。抽象类中,既可以全是抽象方法,也可以全是非抽象方法。一个继承于抽象类的子类,只有实现了父类所有的抽象方法才能够是非抽象类
接口只是一个概念,它在C++中用抽象类来实现
接口是专门被继承的,接口存在的意义也是被继承,和C++里的抽象类里的纯虚函数是相同的,不能被实例化
当继承一个接口时,接口里的所有函数必须全部被覆盖
Tip: 接口的意义在于提前协定标准,构建共识,可以更为高效和低成本地进行大规模协作,利于构建模块化和松耦合的系统
public static final
类型,并且默认即为 public static final
类型虚基类是一个相对概念,形式如下
class derive : virtual public base
{
};
虚基类是相对于它的派生类而言的,它本身可以是一个普通的类。只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类。比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有虚继承,那类B就只是类A的基类
虚继承主要用于一个类继承多个类的情况,避免重复继承同一个类两次或多次
例如 由类A派生类B和类C,类D又同时继承类B和类C,这时候类D就要用虚继承的方式避免重复继承类A两次
要求:用基类指针数组,使它的每一个元素指向一个派生类对象
Shape *p[3]
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。