C++面向对象的特点

C++面向对象的特点

面向对象的特点主要有: 封装, 继承, 多态; 现在自己的简单理解如下, 但要明白具体怎么实现, 背后的原理是什么?

什么是封装, C++怎么实现封装

  1. 封装的大致可以分为: 函数的封装和类的封装, 函数的封装相当于把各个功能模块写成一个函数, 从上到下依次调用;
    • 类的封装:就是把变量和函数接口封装为一个class, 这种类就相当于一种类型, 可以声明这种类型的变量, 叫作对象;
  2. 更官方的说法是: 封装将事物拥有的属性和动作隐藏起来, 只保留特定的方法和外界联系(即public函数接口);
  3. 封装就是抽象出类, 类含有属性和方法;
  4. 封装的好处就是代码功能分离;代码清晰易读;

什么是继承, C++怎么实现继承

  1. 继承就是子类可以拥有父类的属性和方法, public继承和private继承;
  2. 继承的优势是: 代码复用率高

什么是多态, C++怎么实现多态

  1. 多态: 简单理解就是一种接口, 可以具有多种不同的实现, 根据基类指针实际指向的类对象调用对应的方法;
  2. 多态实现的一个简单例子
    • 加减乘除各用一个函数实现(既没有类的封装, 也没有体现继承, 更别说多态), 只能勉强说体现了函数封装(功能的封装);
    • 封装就是将这四个功能函数封装成一个类, 包含两个操作变量和四个方法(其实有点为了封装而封装的成分);
    • 为了体现继承和多态: 声明一个基类为纯虚类, 加减乘除声明为派生类, 但具体实现不一样;
  3. 多态也是分很多种的: 重载多态,强制多态,包含多态,参数多态;
    • 普通函数和类的成员函数的重载属于重载多态,还有运算符重载;
    • 强制多态包括类型强制转换等;
    • 包含多态主要通过虚函数来实现;
    • 参数多态和类模板相关;
  4. C++中的多态只能通过指向基类类型的指针和引用来调用对象的虚函数来实现; 因为可以用派生类对象来初始化或者给基类类型的指针赋值;
    • 基类类型的指针所指向的对象有可能是基类型,也可能是派生类型,所以只有到运行时刻我们才知道指针所指向的对象到底是什么类型,所以当我们通过基类型的指针调用对象的虚函数时,只有判断该对象的类型后才知道调用的虚函数是哪一个类型的版本;
  5. 所谓多态,说到底,不外乎就是相同的函数名,不同的功能;
  6. 究C++编译器的实现,就会发现,所谓相同的函数其实在编译之后就变成不同的函数了,因为C++中的函数名被解析成类名+函数名+参数;
  7. 编译期多态以模板实现,运行期多态运用虚函数表实现;
  8. 了解虚函数表的位置, 虚函数表中各个虚函数指针的位置, 以及带有继承类的各个成员变量的位置;
    • 指针和引用,这两个是运行时多态的基石;
    • 创建一个基类指针,当它指向不同的对象时,调用的虚函数也不同,这就是多态;
  9. C++编译器实现多态的原理
    • 当类中声明虚函数时,编译器会在类中生成一个虚函数;
    • 虚函数表是一个存储类成员函数指针的数据结构;
    • 虚函数表是由编译器自动生成与维护的;
    • virtual成员函数会被编译器放入虚函数表中;
    • 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针);

多态, 虚函数, 纯虚函数的关系

  1. 官方一点的多态解释: 是对于不同对象接收相同消息时产生不同的动作;
    • C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;
    • 编译时多态通过模板函数, 模板类来实现, 编译时推导参数反演;
    • 编译时多态性还可以体现在函数和运算符的重载上;
  2. 虚函数:在基类中冠以关键字 virtual 的成员函数, 它提供了一种接口界面, 允许在派生类中对基类的虚函数重新定义;
    • 让每个类都可以覆盖这个方法的内容,非静态成员,具有继承性,不是重载声明而是覆盖,执行不同的函数,
      通过指针指向或者引用, 在C++中,虚函数的唯一用处就是构成多态;
    • 如果不是虚函数继承, 基类指针或引用指向派生类, 调用同一方法其实是调用基类的方法, 编译器认为派生类应该退变为基类在被调用, 有一种隐式类型转换的味道在里面;
  3. 纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义; 作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用; 具有纯虚函数的叫作抽象类(abstract);
上一篇:Asp.Net图片上传后缩略图空白


下一篇:子序列的按位或 Bitwise ORs of Subarrays