C++特性:
1、封装(实现代码模块化)
2、继承(实现代码扩展)
3、多态(静态多态和动态多态)
【封装】: 类是面向对象程序设计语言中的一个概念。类是对某个对象的定义。包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。
封装的类有如下的访问类型:
1)公有( public )成员可以在类外访问;
2)私有( private )成员只能被该类的成员函数访问;
3)保护( protected )成员只能被该类的成员函数或派生类的成员函数访问。
数据成员通常是私有的,成员函数通常有一部分是公有的,一部分是私有的。因为类的公有的函数可以在类外被访问,也称之为类的接口。(实际中具体的访问权限情况根据实际情况而定)
【继承】:继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易的同时也达到了重用代码功能和提高执行时间的效果。当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
【多态】:顾名思义就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
多态分为静态多态(函数重载和泛型编程)和动态多态(虚函数)
1、静态多态
函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话就会发出警告或者报错。
2、动态多态
动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。
基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。
通过基类对象的指针或者引用调用虚函数,因为派生类对基类中的虚函数进行重写,使用派生类的虚函数替换相同偏移量位置的基类虚函数,如果派生类中新增加自己的虚函数,按照其在派生类中的声明次序,放在上述虚函数之后 。
虚函数
虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接或后期绑定。
C++中虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。
重写:
(a)基类中将被重写的函数必须为虚函数
(b)基类和派生类中虚函数的原型必须保持一致(返回值类型,函数名称以及参数列表),协变和析构函数(基类和派生类的析构函数是不一样的)除外
(c)访问限定符可以不同
什么是协变?
协变:基类(或者派生类)的虚函数返回基类(派生类)的指针(引用)
重载:
指在同一作用域中允许有多个同名函数,而这些函数的参数列表不同,包括参数个数不同,类型不同,次序不同,需要注意的是返回值相同与否并不影响是否重载。
【面试较常问的问题】
————————————————————————————————————————————————————————————
1、哪些函数不能定义为虚函数?
1)友元函数,它不是类的成员函数
2)全局函数
3)静态成员函数,它没有this指针
4)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)
2、动态多态缺陷
降低了程序运行效率(多态需要去找虚表的地址)
空间浪费(需要创建虚表,浪费空间)