IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> cpp多态 -> 正文阅读

[C++知识库]cpp多态

什么是多态?
顾名思义就是同一个事物在不同场景下的多种形态

  • 多态
    • 静态多态:编译器在编译期间完成
      • 函数重载
        • 相同的函数名
        • 根据调用参数的不同(参数类型,参数长度),不可根据返回值来判断重载
        • 根据实参类型选择调用合适的函数
          • 合适则调用
          • 不合适则警告或者报错
      • 泛型编程
        • 模板template
    • 动态多态:在程序运行时根据基类的引用或指针 所指向的对象 来确定自己该调用哪一个类的虚函数(因为对象的引用在程序中是变换的,因此是运行时确定)
      • 虚函数
      • 动态多态的条件:
        • 基类中必须包含虚函数,派生类中必须对基类的虚函数进行重写
        • 通过基类(纯虚类)对象的指针或者引用来调用虚函数

如果不是虚函数,那么如果在派生类中出现了与父类同名的函数,那么在即使在使用派生类的对象调用该同名函数时,调用的依然会是父类的;

什么是重写

  • 重写
    • (1)在基类中被派生类重写的函数必须为(纯)虚函数(否则就是产生二义性)
    • (2)重写的函数 在基类和派生类中 的原型 保持一致,协变 和 析构函数除外
      • 原型指:函数返回值类型,函数参数列表,函数名
      • 析构函数名与类名相关
    • (3)访问限定符可以不同

什么是协变?

  • 协变
    • 基类(派生类)的虚函数返回基类(基类)的指针或者引用
//纯虚类 和 纯虚函数
class A{
    virtual void func1() = 0; // 纯虚函数
}
// 有纯虚函数的 类 成为纯虚类,不能创建纯虚类的对象,只能是指针或者引用 ;

class B:public A{
    void fun2();
}
// B继承了A,但是并没有实现基类A中的纯虚函数,因此B也是纯虚类

class C:public:A{
    void func1(){
        ///codes
    }
}
// C继承了A,并实现基类A中的纯虚函数,因此C不是纯虚类
  • 哪些函数不能定义为虚函数
    • 友元函数,因为它不属于类的成员函数
    • 全局函数
    • 静态成员函数,因为它没有this指针
    • 构造函数,拷贝构造函数(**)
    • 运算符重载函数可以,但是一般不建议

(**):
类包含虚函数时,编译器在编译期为该类型生成虚函数表;

在类的对象创建时,编译器为该对象生成一个指向虚函数表的 虚函数指针( PVFT* 4 Byte)

虚函数指针的初始化是在构造函数中完成的;

因此,不能将构造函数定义为虚函数 virtual

纯虚类

  • 抽象类(纯虚类)
    • 也称为 接口类
    • 包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。
    • 抽象类一定要被继承,否则无意义

那么派生类的虚函数表怎么做的:

  • 派生类虚表:
    • 1.先将基类的虚表中的内容拷贝一份
    • 2.如果发生了重写,使用派生类的虚函数替换相同偏移量位置的基类虚函数
    • 3.如果派生类中新增加自己的虚函数,按照其在派生类中的声明次序,放在上述虚函数之后

多态优点:
●代码组织结构清晰
●可读性强
●利于前期和后期的扩展以及维护 对拓展开放,对修改关闭

多态缺陷:
●降低了程序运行效率(多态需要去找虚表的地址)
●空间浪费(虚函数指针)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:03:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:18:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码