首页 > 其他分享 >4月14日多态的笔迹总结,

4月14日多态的笔迹总结,

时间:2023-04-15 23:44:07浏览次数:40  
标签:虚表 函数 14 笔迹 基类 多态 派生类 指针

1.声明的虚函数若等于零则叫纯虚函数。他不能被不重写继承,且可以代表一些实例化对象抽象的概念。

2.对于虚函数接口继承的理解:普通函数是继承函数所有的东西,派生类就是为了调用这个函数而继承,而虚继承则是继承了这个函数的接口,函数的实现部分需要派生类去重写,从而达成多态。

3.虚函数在类里面以一个虚表里面的指针形式存在着,当派生类继承虚函数时,派生类里面就会新生成一个虚表,若是派生类重写了基类的虚函数,那么派生类实例化对象虚表下的虚函数指针就会与基类不一样,从而调用派生类重写过的函数指针。

4,多态是一个动态重载,他是在运行时来确定需要调用的函数指针来调用函数。而静态重载是在编译时就确定了要调用的函数指针从而直接调用函数,不需要查找,

5.一个函数有多个指令,而函数指针则是函数的第一条指令的指针,

普通函数与虚函数多态时调用的区别,普通函数是直接找到这个函数的指针去使用,什么类型就调用那个类型下的函数,而多态则是,当指针或引用去调用,且函数为虚函数时,这个引用或指针就会在他们所指向的实例化对象下的虚表中去找对应的重写函数的指针,从而使用函数,函数的地址基本存在于常量区代码段,

静态绑定:相当于重载函数,他在编译时就确定了要调用函数的地址,而动态绑定:相当于多态,他是在程序运行时才不断确定函数的地址,

复习c语言中的指针表示:指针数组的表示:int* (*P) [9]表示数组的指针,void(*P)(int,int)表示函数的指针,要注意的是他们在声明时将指针的变量名写在前面,

打印虚函数表的原理:因为虚表在类中存在最前面且是一个指针数组指针的形式存在,因为指针与整形所占的字节是一样的,所以可以先将对象强转为整形指针类型使其在32位系统下只访问四个字节,再将这个指针解引用得到数组的首元素也就是虚表下第一个虚函数的指针,再次将这个指针强转为定义好的指针类型就可以循环打印虚函数的指针了。

若派生类多继承了好几个基类的虚函数,那么这个派生类就有多个虚表,每个虚表与其基类一一对应,

上图可以看到,b和c同时时d的派生类,且没有发生函数重写,但是他们的虚表指针不一样所以基类与派生类不是共用一张虚表不管有没有发生重写,但是b和c却用的是同一张虚表,所以同一类型共用一张虚表。之前有说到析构函数需要写成虚函数来一起析构派生类和基类,当this指针指向派生类时调用派生类的虚析构函数,当指向基类时调用基类的虚析构函数。那么构造函数可否写成虚函数呢

因为虚表是在构造函数初始化列表时才初始化的,所以构造函数不可以写成虚函数,

虚基表和虚表虽然只差了一个字但是他们之间没有关联,虚基表是为了解决类菱形继承导致数据冗余和变量二义性副作用而存在的,他的实现原理是将虚基类的变量放在一个公共位置,原本存放冗余变量的地方变为一个指针,指向一个偏移量,这个指针可以根据这个偏移量来找到冗余的变量,从而解决菱形继承的缺点。当一个派生类虚继承多次基类时,当这个派生类初始化时虚基表下的变量构造只会初始化一次。

 

标签:虚表,函数,14,笔迹,基类,多态,派生类,指针
From: https://www.cnblogs.com/qjwxlj/p/17322289.html

相关文章

  • 2023年4月14日
    FileProvider随着Android版本越来越高,Android官方对用户数据保护力度也越来越大。Android提供FileProvider类来供应用之间共享数据。如:<pathsxmlns:android="http://schemas.android.com/apk/res/android"><files-pathname="my_images"path="images/"/>...<......
  • kuangbin专题一 简单搜索 罐子(POJ-3414)
    PotsTimeLimit:1000MS MemoryLimit:65536KDescriptionYouaregiventwopots,havingthevolumeofAandBlitersrespectively.Thefollowingoperationscanbeperformed:FILL(i)fillthepoti(1≤i≤2)fromthetap;DROP(i)emptythep......
  • 【剑指 Offer 】14- I. 剪绳子
    【题目】给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例1:输入:......
  • 4.14团队冲刺第二天
    首先今天我们进一步讨论了作业的整体流程,大致明确了思路。前端的页面大致快完成,我们打算先通过调接口的方式实现拍照和语音实现垃圾分类。如果有条件的话,学习一下如何在安卓布置服务器,实现类似于咸鱼的社区效果。其次就是SSM框架和VUE前端框架,之前太懒散了,坚持每天学一点点吧。......
  • 2023-04-14 Fatal error: Call to a member function fetch_assoc() on a non-object
    问题:php报错。业务场景:使用update语句去更新数据库字段。原因:update接收值不正确。原代码:$query="UPDATEstudentSETdate=now()WHEREid=$id";$result=$mysqli->query($query2)ordie($mysqli->error);//问题出在这$data=$result->fetch_assoc(); i......
  • 20230414小记
    所以我选择被人讨厌————纯白↑快来一起听感受相仿的情绪。如果你可以共情。现在发现自己的精神状态真的堪忧。感觉被拉扯着还前进不了。看看成绩就突然不想活了。没意思。何必被牵扯着前进呢。在想学文化课的时候被竞赛打乱,在学竞赛的时候天天被磨叨文化课。被别人的......
  • 4月14日继承与多态
    所以说继承到派生类的基类成员初始化必须调用基类自己的构造函数,如果派生类无权调用基类的构造函数那么也就无法继承了。还有要注意的是一个派生类无法继承基类的友元函数,就是说一个类以外的友元函数可以访问基类的私有变量但是无法访问继承基类的派生类的私有变量,静态成员的继......
  • 总结20230414
    今天周五,一周课最多了,但是今天也是很开心的!今天上的是计算机网络、概率论、web应用开发技术、数学建模B。计算机网络讲的是ARP协议以及具体传输时的传输过程,这几节课感觉听得挺不错的,挺轻松的。概率论讲的是二维随机变量分布的函数以及习题,一开始听的有点懵,但是后来悟明白了,边......
  • 2023.4.14
    1//编程一百题2//1.4抓交通肇事犯3#include<iostream>4usingnamespacestd;5intnum=0;6intmain()7{8for(inti=1;i<=9;i++)9{10for(intj=0;j<=9;j++)11{12if(i!=j)13{14......
  • 【230414-1】乒乓球队的10名队员中有3名主力队员,派5名参加比赛,3名主力要安排在第一、
    ......