相信不少入门C++的萌新都会被灌输这么一个理念,那就是C++是面向对象编程,并且有三大特性,继承封装多态。首先我们了解一下这三个特性的大概含义和优缺点,再看看为什么这三个特性是C++独有的而C没有。
(1)继承:
C有struct,也能往里面塞函数或者数据,乍一看和C++的class差不多,然而C的struct却不能继承,这是三大特性其一,多了继承这个概念。
优点:1.减少重复的代码。
2.继承是多态的前提。
3.继承增加了类的耦合性。
缺点:1.继承在编译时刻就定义了,无法在运行时刻改变父类继承的实现;
2.父类通常至少定义了子类的部分行为,父类的改变都可能影响子类的行为;
3.如果继承下来的子类不适合解决新问题,父类必须重写或替换,那么这种依赖关系就限制了灵活性,最终限制了复用性。
虚继承:为了解决多重继承中的二义性问题,它维护了一张虚基类表。
(2)封装:
隐藏对象的属性和实现细节,仅仅对外提供接口和方法。相比较于C,struct中函数和成员数据都是公开的,因为C没有访问限定符public,private,protected这种说法,所以C也无法封装函数或者数据,不让调用者可以直接调用,这是三大特性其二,C++相比C多了封装。
优点: 1)隔离变化;2)便于使用; 3)提高重用性; 4)提高安全性
缺点: 1)如果封装太多,影响效率; 2)使用者不能知道代码具体实现。
(3)多态:
C++中有两种多态,称为动态多态(运行期多态) 和静态多态(编译期多态),如下图,接下来我们展开讲讲。
静态多态
静态多态主要通过函数重载和模板来实现,宏也是实现静态多态的一种途径 。
函数重载
int Add(int left, int right) { return left + right; } double Add(double left, int right) { return left + right; } int main() { Add(10, 20); //Add(10.0, 20.0); //这是一个问题代码 Add(10.0,20); //正常代码 return 0; }
泛型编程
所以泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。在C++中就是指的模板,模板本身也是多态的一种体现。
动态多态
动态多态在C++中是通过虚函数实现的 ,即在基类中存在一些接口(一般为纯虚函数),子类必须重载这些接口。这样通过使用基类的指针或者引用指向子类的对象,就可以实现调用子类对应的函数的功能。动多态的函数调用机制是执行期才能进行确定,所以它是动态的。
虚函数
优点:1.大大提高了代码的可复用性;
2.提高了了代码的可维护性,可扩充性;
缺点:1.易读性比较不好,调试比较困难
2.模板只能定义在.h文件中,当工程大了之后,编译时间十分的变态
第三点多态,主要体现在函数重载,模板和虚函数这三个点,让同一个函数在不同参数的情况下产生不同效果,或者两个继承关系的类的对象调用同一个方法却得到不同的效果。