C语言进阶

张萃

目录

  • 1 第一章  C++的初步知识
    • 1.1 从C到C++
    • 1.2 C++的词法和词法规则
    • 1.3 最简单的C++程序
    • 1.4 C++对C的扩充
      • 1.4.1 C++的输入输出
      • 1.4.2 用const定义常量
      • 1.4.3 函数原型声明
      • 1.4.4 函数重载
      • 1.4.5 函数模板
      • 1.4.6 有默认参数的函数
      • 1.4.7 变量的引用
      • 1.4.8 内置函数
      • 1.4.9 作用域运算符
      • 1.4.10 字符串变量
      • 1.4.11 动态分配/回收内存运算符
  • 2 类和对象
    • 2.1 面向对象程序设计方法概述
    • 2.2 类的声明和对象的定义
    • 2.3 类的成员函数
    • 2.4 对象成员的引用
    • 2.5 类和对象的简单应用
    • 2.6 类的封闭性和信息隐蔽
  • 3 关于类和对象的进一步讨论
    • 3.1 构造函数
    • 3.2 析构函数
    • 3.3 调用构造函数和析构函数的顺序
    • 3.4 对象数组
    • 3.5 对象指针
    • 3.6 共用数据的保护
    • 3.7 对象的动态建立和释放
    • 3.8 对象的赋值和复制
    • 3.9 静态成员
    • 3.10 友元
    • 3.11 类模板
  • 4 运算符重载
    • 4.1 什么是运算符重载
    • 4.2 运算符重载的方法
    • 4.3 重载运算符的规则
    • 4.4 运算符重载函数作为类成员函数和友元函数
    • 4.5 重载双目运算符
    • 4.6 重载单目运算符
    • 4.7 重载流插入运算符和流提取运算符
  • 5 继承与派生
    • 5.1 继承与派生的概念
    • 5.2 派生类的声明方式
    • 5.3 派生类的构成
    • 5.4 派生类成员的访问属性类型兼容规则
    • 5.5 派生类的构造函数和析构函数
    • 5.6 多重继承
  • 6 多态性与虚函数
    • 6.1 多态性的概念
    • 6.2 一个典型的例子
    • 6.3 虚函数
    • 6.4 纯虚函数与抽象类
  • 7 输入输出流
    • 7.1 C++的输入输出
    • 7.2 标准输出流
    • 7.3 标准输入流
    • 7.4 对数据文件的操作与文件流
    • 7.5 字符串流
多态性的概念

       

      在面向对象方法中这样描述多态性,向不同的对象发送同一个消息,它们接收后会产生不同的行为(即方法)。

        在C++ 程序设计中,多态性是指具有不同功能的函数可以使用一个函数名。

       1、说明

      “多态性”,指同样的消息被不同的对象接收时导致的不同行为。

       “消息” 是指对类的成员函数的调用;

      “不同的行为” 是指不同的实现,也就是调用了不同的函数。

        注:函数的重载、运算符重载都是多态现象。

       2、多态性分类

      (1)静态多态性, 学过的函数重载和运算符重载属于静态多态性,在编译程序时系统就可以确定调用哪个函数,它又称编译时的多态性。

        静态多态性是通过函数重载实现的。

     (2)动态多态性,是在程序运行中才能确定操作所针对的对象,它又称运行时的多态性。

        动态多态性是通过虚函数实现的。

        3、研究的问题

        从一个基类派生出不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果在运行时用相同的成员名调用类的成员,会调用哪个类的成员?

       即,通过继承而产生了相关的不同的派生类,与基类成员同名的成员在各个派生类中有不同的含义。

       多态性是一个接口多种方法。

       4、多态性的基础——赋值兼容性规则

      (1)含义

        在需要基类对象的任何地方都可以使用公有派生类的对象来替代。

      (2)实质

        公有派生类实际上具备了基类的所有功能,凡是基类能解决的问题,派生类都可以解决。

       5、赋值兼容性规则

      (1)派生类的对象可以给基类的对象赋值。

        例: class  derived :public base;  

                            //  derived类是base类的公有派生类

               derived  d;

               base b;

               b=d;

       反之不然,即基类对象不能赋值给派生类的对象,即使使用强制类型转换也不行。

          例:d=b;               //error

                 d= (derived) b;  //error

          原因:基类对象不具有派生类的所有成员.

       (2)派生类的对象可以初始化基类引用。

        例: class  derived :public base; 

                 derived d;    

                 base &rb=d;

        反之不然,除非通过强制类型转换,用一个基类的对象初始化其派生类的对象。

          例:base b;                                 //正确

                 derived &rd=(derived) b;      //正确

       (3)派生类的对象的地址可以赋给指向基类的指针。

         例:class  derived :public base; 

                 derived  d ;  base *pb=&d;

        反之不然,除非通过强制类型转换,把一个指向基类的指针赋值给一个指向其派生类的指针。例:base *pb=new base;

                    derived *pd=(derived *)pb;

         6、赋值兼容性规则的作用

        赋值兼容性规则的引入,对于基类及其公有派生类的对象,就可以使用相同的函数统一处理,而没有必要为每个类设计单独的功能模块。

        (1)当函数的形参为基类对象时,实参可以是派生类的对象。

        (2)当函数的形参为指向基类对象的指针时,实参可以是派生类对象的地址。

         (3)当函数的形参为基类对象的引用时,实参可以是派生类的对象。