关于面向对象
c++的面试经常以”谈谈面向对象吧”开头
当然,以”今天我们就问到这里,你还有什么想知道的吗结尾”…
什么是面向对象
对象是指具体的某一个事物
事物的抽象就是类,类中包含数据(成员变量)和动作(成员方法)
面向对象的三大特性
封装
将客观事物进行抽象,将其属性和方法合成为一个类,类封装了成员变量和成员函数,同时又实现对属性和方法的权限控制,降低与外界的耦合度
继承
子类继承父类的各种属性和方法,同时子类还可以在父类的基础上重新定义和扩展父类的属性和方法,使其具有不同的功能,继承提高了代码的复用性及可维护性
但是当父类中的成员变量、成员函数或者类本身被 final 关键字修饰时,修饰的类不能继承,修饰的成员不能重写或修改
继承的好处:提高代码的复用性;提高代码的拓展性;是多态的前提
多态
多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式
静态多态
静态多态有函数重载、运算符重载、泛型编程等
静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错
动态多态
动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向 父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向 子类对象时,就调用子类中定义的虚函数
动态多态行为的表现效果
同样的调用语句在实际运行时有多种不同的表现形态
实现动态多态的条件
要有继承关系
要有虚函数重写
要有父类指针(父类引用)指向子类对象
重载 重写 隐藏
都是对于函数来说的
重载
函数名相同,函数的参数列表不同,不关心函数返回类型
C++中重载的实现 采用命名倾轧(name mangling)技术,编译时会将同名的函数或方法根据某种规则生成不同的函数或方法名(因为函数或方法的特征标不一样)大概是函数名+参数列表的形式(对比C语言就没有, 所以C没有重载)
隐藏
是指派生类的函数屏蔽了与其同名的基类函数,只要同名函数,不管参数列表是否相同,基类函数都会被隐藏
重写(覆盖)
是指派生类中存在重新定义的函数。函数名、参数列表、返回值类型都必须同基类中被重写的函数一致,只有函数体不同。派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有 virtual 修饰