码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ 多态(补充)


    目录

    1.静态的多态与动态的多态

    2.虚函数定义

    3.虚函数的重写 

    4.多态的实现

    5.虚函数重写的例外

    6.C++11 override 和 fifinal 

    7.重载、覆盖(重写)、隐藏(重定义)的对比

     8.抽象类

    9.虚函数表

    10.几个关于虚表的问题

    11.继承关系的虚函数表


    1.静态的多态与动态的多态

    2.虚函数定义

    3.虚函数的重写 

    4.多态的实现

    传父类的指针或者引用

    5.虚函数重写的例外

     协变 

     析构函数的重写

    virtual去掉同样完成重写。说明在普通场景下,析构函数是不是虚函数没有影响。若定义一个既可指向父类对象又指向子类对象的指针,不构成重写时,存在内存泄漏的问题

     加上virtual构成虚函数后完成析构

     子类不写virtual关键字

     针对虚函数重写,尽量使用协变,严格按照重写要求来,这样代码更容易维护

    6.C++11 override 和 fifinal 

    7.重载、覆盖(重写)、隐藏(重定义)的对比

    不构成多态,就是按指针类型去调用的。构成多态,就是去对象虚表中去找的。

    重载
    函数重载是指在一个类中声明了多个名称相同但参数列表不同的函数,这些参数可能个数、顺序、类型不同,不能靠返回值类型来判断。
    特征:

    • 在同一个作用域中;
    • 函数的名字相同;
    • 参数不同;
    • 返回值可以不同;
    • 函数重载与virtual修饰无关;

    函数重写(也称覆盖)
    函数重载是指子类重新定义基类的虚函数。
    特征:

    • 不在同一作用域(分别位于基类和派生类);
    • 函数名字相同;
    • 参数相同
    • 返回值相同,否则会出错;
    • 基类和派生类必须是虚函数,派生类virtual可不加,派生类的访问权限可以和基类的访问权限不一样,基类中的虚函数的访问权限必须是public;
    • 重写函数的访问修饰符可以不同;

    重定义(又称隐藏)
    特征:

    • 不在同一个作用域(分别位于基类和派生类中);
    • 函数名字相同;
    • 返回值可以不同;
    • 参数不同
    • 参数不同;此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及重写混淆);
    • 参数相同;但是基类函数没有 virtual关键字,此时,基类的函数被隐藏(注意别与重写混淆);
    • 两个基类和派生类的同名函数不构成重写、就是重定义;

     8.抽象类


     

     

     纯虚函数不只可以声明,还可以定义,但是没意义(即使定义实现出来也无从调用,体现了接口继承)

    9.虚函数表

    1. // 1.我们增加一个派生类Derive去继承Base
    2. // 2.Derive中重写Func1
    3. // 3.Base再增加一个虚函数Func2和一个普通函数Func3
    4. class Base
    5. {
    6. public:
    7. virtual void Func1()
    8. {
    9. cout << "Base::Func1()" << endl;
    10. }
    11. virtual void Func2()
    12. {
    13. cout << "Base::Func2()" << endl;
    14. }
    15. void Func3()
    16. {
    17. cout << "Base::Func3()" << endl;
    18. }
    19. private:
    20. int _b = 1;
    21. };
    22. class Derive : public Base
    23. {
    24. public:
    25. virtual void Func1()
    26. {
    27. cout << "Derive::Func1()" << endl;
    28. }
    29. private:
    30. int _d = 2;
    31. };
    32. int main()
    33. {
    34. Base b;
    35. Derive d;
    36. return 0;
    37. }

     

    以笔试题为例子

     该对象除了包含int,char,还有一个指针,该指针用来实现多态

     

    从反汇编的角度看虚表

     

    10.几个关于虚表的问题

     

     

     

    11.继承关系的虚函数表

     虚表存储的区域

    单继承中的虚函数表 

     写一个函数打印虚表,确认虚表中调用的函数

     

    多继承中的虚函数表 

  • 相关阅读:
    玩转云端 | 天翼云对象存储ZOS高可用的关键技术揭秘
    简历准备及面试技巧,你应该知道的一切
    Mysql索引特性(重要)
    StarGAN v2: Diverse Image Synthesis for Multiple Domains (多域多样性图像合成)
    【技术番外篇】国家高新技术企业 认定
    【广州华锐互动】煤矿坍塌VR事故警示教育突破了哪些限制?
    flink sqlClient提交hiveIceberg
    论文解读(gCooL)《Graph Communal Contrastive Learning》
    IntelliJ IDEA【前端必备插件】
    Java中锁的使用及死锁、快速幂
  • 原文地址:https://blog.csdn.net/m0_61548909/article/details/125887947
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号