找回密码
 立即注册
首页 资源区 代码 深入剖析C++多态的实现与原理-详解 (万字长文) ...

深入剖析C++多态的实现与原理-详解 (万字长文)

战匈琼 2025-6-4 16:43:26
目录

  • 一、多态基础

    • 虚函数

      • 虚函数的继承

    • 虚类/虚基类
    • 重写/覆盖

      • 条件:
      • 概念:

    • 多态的条件

      • 其他的多态行为

        • 多态中子类可以不写virtual
        • 协变

          • 代码举例



    • 继承遗留问题解决

      • 析构函数

        • 具体解决方式:


    • 题目1

      • 答案:
      • 解析:

    • 题目2

      • 答案:

    • C++11 override和final

      • final

        • 功能1:禁用继承

          • 使用场景:

        • 功能2:禁用重写

          • 使用场景


      • override

        • 场景:
        • 描述:
        • 用法:


    • 重载、覆盖(重写)、隐藏(重定义)的对比
    • 纯虚函数

      • 概念:

    • 抽象类/纯虚类

      • 概念
      • 特点

    • 接口继承和实现继承

  • 二、多态原理

    • 引入(多态的原理)
    • 虚函数表指针
    • 虚函数表/虚表

      • 描述:
      • 虚表的特性(单继承)
      • 虚表的一般示例:
      • 对象中的虚表指针在构造函数中初始化
      • 虚表的位置

    • 谈谈对象切片
    • 谈谈多态的原理
    • 虚表打印

      • 例程1.VS查看虚表
      • 例程2.程序打印虚表

        • 源码:


    • 多继承虚表

      • 多继承下子类自己新增的虚函数在哪?

        • 多继承虚表打印代码

          • 结论与发现:
          • this指针修正分析
          • 虚表中地址(概念修正)



    • 菱形继承+多态 与 菱形虚拟继承+多态

      • 菱形继承+多态
      • 菱形虚拟继承+多态(子类没有新增虚函数)
      • 菱形虚拟继承+多态(子类自己新增了虚函数)

    • 一些概念

      • 动态绑定和静态绑定
      • 内联函数inline 和 虚函数virtual
      • 静态函数static 与 虚函数
      • 构造函数、拷贝构造函数、赋值运算符重载 与 虚函数
      • 虚函数和普通函数谁快?



一、多态基础

虚函数

在函数前加上virtual就是虚函数
  1. class A{
  2. public:
  3.         virtual void func(){}; //这是一个虚函数
  4. };
复制代码
虚函数的继承

虚函数的继承体现了接口继承
继承了接口等于继承了函数的壳,这个壳有返回值类型,函数名,参数列表,还包括了缺省参数
只需要重写/覆盖接口的实现(函数体)
虚类/虚基类

含有虚函数的类是虚类.
虚基类是虚拟继承体系中的基类,注意区分.
重写/覆盖

条件:

三同:函数名,参数(平常说的参数都是说参数的类型,与缺省参数无关),返回值都要相同
概念:

重写/覆盖是指该函数是虚函数且函数的名字、类型、返回值完全一样的情况下,子类的函数体会替换掉继承下来的父类虚函数的函数体

  • 体现接口继承
  • 重写/覆盖只有虚函数才有,非虚函数的是隐藏/重定义.注意区别
  • 重写/覆盖只对函数体有效,返回值类型,函数名,参数列表,和缺省参数都不能修改
  • 只要子类写上满足三同的虚函数都会触发重写.无论是否修改函数体
多态的条件

多态有两个条件,任何一个不满足都不能执行多态 ,分别是

  • 虚函数的重写
多态的基础
[code]   class Person {   public:       virtual void BuyTicket() {            //是虚函数           std::cout
您需要登录后才可以回帖 登录 | 立即注册