c++三大特性:封装,继承,多态

【1】封装:

封装是设计类的基本原理,把抽象出来的数据和功能结合起来,去形成一个类。

数据和函数都是类的一个成员,它的主要目标就是使得代码模块化,在类中有public,protect,private三种类型的关键字,把类的成员做权限的管理,隐藏内部的实现,给出外部的接口。

比如说有些人写代码不提供任何的public的数据成员,而是用设置成private,然后通过设计读写的函数去访问,这就是封装。

public:父类对象、子类对象的内部外部都可以去访问。

protected:父类对象,子类对象的内部可以访问,但是外部不可以。

private:只有父类对象内部,才可以访问。

【2】继承

扩展:https://www.cnblogs.com/EvansPudding/p/12565699.html

继承的意义在于扩展已经存在的类,来达到代码重用的目的。

一个类B继承自另一个类A,那B就被称为A的子类。继承可以让子类拥有父类的属性和方法,不需要额外在写,可以根据需要重新定义某个属性(定义同名的数据成员,此时在派生类中存在俩个同名的数据成员,一个属于基类,一个属于自己,如果要调用基类的数据成员,就必须加上类名::),或者是重写(就是和基类的方法,返回值、参数、函数名都相同,否则就是重载)某个方法(方法在类中也就是函数)

继承有三种方式,也是public、protected、private。

这里要注意,无论是那种继承,都不影响子类堆父类的访问权限,如果之前父类的成员是private的,即使你是public的继承,依然不能访问。

这个继承方式是为了控制子类的调用方,也就是用户,对于父类的访问权限。

具体说:public继承,public的权限还是public。如果是protected继承,父类的public成员在自己类中就变成了protected的访问控制权限,private继承,父类的public和protected成员在自己类中变成了private访问控制权限。

友元关系是不能被继承的。

友员在类中声明,在类外实现的函数,或者是类。友员允许访问类中一切的成员。

【3】多态

多态的简单理解就是一个接口,多种实现。(C++本身没有接口这个概念)

(1)一种是函数重载(overload):在编译期间,决定函数的调用(也被成为静态多态)

  1. 相同的作用域,比如说再同一个类中
  2. 函数名字相同,参数不同列表
  3. virtual关键字可有可无
  4. 不关心函数返回类型

(2)第二种是函数重写(override):在派生类中重新定义的函数,它的函数名,参数列表,返回值类型,所有都必须和基类中被重写的函数相同。在运行期间,决定函数调用。(也被叫做动态多态)

  1. 不同的作用域,分别位于子类和基类
  2. 函数名、参数列表、返回类型相同
  3. 基类的函数必须有virtual关键字

隐藏:派生类屏蔽了和它同名的基类函数,只要同名,不管参数列表,基类都会被隐藏。

  1. 不在同一个作用域(分别位于派生类与基类)
  2. 函数名字相同
  3. 返回类型可以不同
  4. 参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)而不是被重写
  5. 参数相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

(3)泛型编程。(这也是静态的多态)

在c++中主要是函数模板,类模板

不是真正的函数,只是一个用来生成正在函数的一个模板,只有当通过模板使用某个具体的函数时,才会真正生成这个函数。

函数模板不允许自动类型转换,不可以设置默认的模板实参。

静态/动态多态的优缺点

  • 静态:
    优点:编译期完成的,效率高。带来了泛型设计的概念,像我们经常使用的STL库,就是基于泛型来设计的。
    缺点:通过模板来实现静态多态,模板的调试困难,代码膨胀、编译慢的问题
  • 动态:
    优点:直观,面向对象设计;接口和实现分离,可以复用。
    缺点:运行的时候绑定,开销大。类继承下,对接口修改会影响整个类层次。
原文地址:https://www.cnblogs.com/EvansPudding/p/12606789.html